如何转义未知字符串并将其传递给本机命令

时间:2019-07-17 20:02:46

标签: powershell cmd escaping quoting

考虑以下示例(忽略安全隐患):

$pass = (Read-Host)
&net user testuser $pass /add

现在,如果有人输入类似的内容:

a1'"\'"\'"\

这行不通。我收到一条错误消息,指出该用户不存在。

我尝试使用[Regex]::Escape(),但是它不起作用。我尝试将$pass用双引号引起来,但是它不起作用。我尝试像这样使用Start-Process

Start-Process -Wait net -ArgumentList @("user", "testuser", $pass, "/add")

但不起作用。我尝试运行net命令时不使用前置&符,但是它不起作用。

我读了大约在询问“ powershell转义命令参数”(显示的197个)后,在StackOverflow上显示了30个问题,但是没有什么比我需要的要差的了。也许我错过了一些东西,但是197个问题很多

编辑:

好,所以我找到了:

https://github.com/PowerShell/PowerShell/issues/1995

似乎没有编写自定义函数并且不知道所调用的是本机二进制文件还是cmdlet或其他东西,几乎不可能正确地做到这一点。从来没有比现在更合适的时候说“我什至没有”。

编辑2: 关于这种情况(用户创建和正确的密码引用),Ansgar Wiechers提供了链接,该链接显示了另一种创建本地用户帐户的方法,这一点非常感谢。这并不意味着报价问题就消失了,只是意味着在需要这种报价的情况下,情况减少了。

1 个答案:

答案 0 :(得分:2)

注意:考虑到下面详细介绍报价方面的挑战,请考虑使用solving this problem differently,它最终可能会提供更多的灵活性和更好的安全性。
但是,重要的是要了解PowerShell的一般报价挑战,尤其是因为并非总是可以使用替代方法来调用外部程序。


虽然没有必要,但不幸的现实是PowerShell需要手动转义嵌入的"字符。作为参数传递给外部程序时的\",这是一个长期存在的问题,总结在this GitHub issue中。

# Sample password
$pass = @'
a1'"\'"\'"\
'@

#"# Escape all embedded " chars. as \"
net user testuser ($pass -replace '"', '\"') /add

关于您尝试过的事情

  

我尝试使用[Regex]::Escape()

您正试图传递存储在变量 verbatim 中的密码,因此此处不使用正则表达式。

  

我尝试将$ pass放在双引号中

这没有效果,因为$pass是一个字符串变量开头(Read-Host返回的字符串)。

  

我尝试使用Start-Process

Start-Process永远不是用于同步调用控制台应用程序的正确工具-请参见https://stackoverflow.com/a/51334633/45375

此外,Start-Process有自己的报价挑战-参见this GitHub issue