【问题标题】:Windows 10 runas escapingWindows 10 runas 转义
【发布时间】:2016-05-25 06:30:19
【问题描述】:

这更多是理论上的构造,或者是一个有趣的问题,而不是现实世界的场景——在这种情况下,我会使用批处理文件来防止转义问题。

  1. 假设我们想以某种方式在 Windows 10 上运行 runas:

    runas /user:John "cmd.exe /k echo %path%"
    

    这不起作用,因为 %path% 被扩展并且我们得到错误:

    正在尝试启动 cmd.exe /k echo C:\Program Files (x... ... RUNAS 错误:无法运行 - cmd.exe /k ech... ... 1734: 数组边界无效。

    有可能解决这个问题吗? IE。如何逃脱%? 如果我们尝试

    runas /user:John "cmd.exe /k echo ^%path^%"
    

    新shell窗口中的输出只是

    %path%
    

    这不是我们想要的(我们希望将 PATH 变量的值打印到控制台)。

  2. 假设我们想要一些其他的东西,我们需要在我们的命令中使用 ":

    runas /user:John "cmd.exe /k dir c:\Program Files"
    

    这不起作用-显然是因为程序和文件之间的空间,出现的新外壳窗口显示两次“未找到文件”。

    人们会期望解决这个问题的方法是

    runas /user:John "cmd.exe /k dir ^"c:\Program Files^""
    

    但这不起作用(runas 打印使用帮助)。问题是为什么?

    这里真正的解决方案是使用\"

    runas /user:John "cmd.exe /k dir \"c:\Program Files\""
    

    这种转义可以在 runas 使用帮助示例部分看到。但这不是转义引号的常用方法,是吗?这里的问题 - 为什么^" 不起作用?

【问题讨论】:

  • 当然runas .... set path是一种作弊方式,让它在新窗口中显示路径:)

标签: cmd escaping windows-10 runas


【解决方案1】:

我们涉及三个实体:

  • 外部cmd shell,您在其中输入runas ...
  • runas.exe,获取凭据,启动新进程等。
  • 内部 cmd shell,这是 runas 被告知要执行的内容

当你输入runas ... "cmd.exe /k echo %path%"

  • 外壳看到%path%并展开它
  • runas 接受扩展命令,以它作为参数启动内壳
  • 内壳与所见相呼应

当你输入runas ... "cmd.exe /k echo ^%path^%"

  • 外壳在引号中看到^%path^% ,并将插入符号解释为转义百分号,因此它不会扩展path 并将插入符号留在原处时间>
  • runas 看到要以cmd.exe /k echo %^path^% 运行的命令
  • 内壳看到echo ^%path^%,您在新窗口中看到%path%

所以当插入符号在引号内时,它们会被保留。但如果不使用引号,runas 将不起作用——该命令必须被视为单个参数。怎么办?

一种方法是使用批处理文件,就像你说的那样。

另一个是使用不同的环境变量:

set aa=echo ^%path^%
runas /user:rpres "cmd.exe /k %aa%"
  • 外壳在set 命令中看到插入符号不在引号中,并生成一个值为echo %path% 的变量
  • 外壳在runas 行上看到一个要扩展的变量,并对其进行扩展。一次。内部%path% 没有展开
  • runas 将命令视为 cmd.exe /k echo %path%,而 runas 则认为
  • 内壳看到echo %path%。它扩展了路径。您会在新窗口中看到展开的路径。

最后一种方法是在转义插入符号之前去掉引号:runas.exe ... "cmd.exe /k echo "^%path^% 不过,重要的是没有不在引号中的空格!

  • 外壳会看到runas 行上的插入符号不在引号中,并在删除插入符号时转义百分号。
  • runas 将命令视为 cmd.exe /k echo %path%,而 runas 则认为
  • 内壳看到echo %path%。它扩展了路径。您会在新窗口中看到展开的路径。

请注意,您可以在完成转义百分比后“返回引号”。例如runas /user:rpres "cmd.exe /k echo here is my path :::"^%path^%":::" 将显示here is my path,后跟用三个冒号括起来的路径。

【讨论】:

  • 这个技巧结束引用的部分并在引用的参数之外有^%path^%,但没有空格,就可以了!很不错。所以这回答了 1. 你能提供 2. 的答案吗?
  • 2 符合我的第二种情况。 shell 在引号中看到插入符号,因此不会扩展它们,而是保持它们完好无损。如果你想用插入符号来做,你必须离开引号,添加一个插入引号,然后回到引号,然后再次退出引号并以插入引号结束:runas /user:rpres "cmd.exe /k dir "^""c:\program files"^"
  • 更容易接受runas的建议并使用反斜杠
猜你喜欢
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
相关资源
最近更新 更多