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

How to escape unknown string and pass it to native command

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

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

现在如果有人输入如下内容:

a1'"\'"\'"\

这行不通。我收到错误消息说这样的用户不存在。

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

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

但它不起作用。我尝试了 运行 net 命令而不使用前导符号,但它不起作用。

我读了大约。 Whosebug 上的 30 个问题在询问 "powershell escape command argument"(显示的 197 个中)后显示,但没有任何问题接近我需要的。也许我错过了什么,但是 197 个问题 很多

编辑:

好的,所以我找到了这个:

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

如果不编写自定义函数并且不知道调用的是本机二进制文件还是 cmdlet 或其他东西,似乎几乎不可能正确地完成它。现在是说 "I don't even".

更合适的时刻

编辑 2: 对于这种情况(用户创建和正确引用密码),Ansgar Wiechers 提供了 link 展示了另一种创建本地用户帐户的方法,非常感谢。这并不意味着引用问题消失了,它只是意味着需要这种引用的情况少了一种。

注意:考虑到下面详述的围绕引用的挑战,请考虑 solving this problem differently,这最终可能会提供更大的灵活性和更好的安全性。
但是,了解 PowerShell 的一般引用挑战很重要,尤其是因为可能并不总是有调用外部程序的替代方法。


虽然没有必要,但不幸的是,PowerShell 需要手动转义嵌入的 " 字符。作为 \" 向外部程序传递参数时,这是 this GitHub issue.

中总结的一个长期存在的问题
# Sample password
$pass = @'
a1'"\'"\'"\
'@

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

至于你试过的

I tried using [Regex]::Escape()

您正在尝试传递存储在变量中的密码逐字,因此正则表达式在这里不起作用。

I tried putting $pass in double quotes

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

I tried using Start-Process

Start-Process 永远不是调用 console 应用程序 同步 的正确工具 - 请参阅 .

此外,Start-Process 有自己的引用挑战 - 请参阅 this GitHub issue