【发布时间】:2019-11-26 17:30:52
【问题描述】:
考虑以下示例(忽略安全隐患):
$pass = (Read-Host)
&net user testuser $pass /add
现在如果有人输入如下内容:
a1'"\'"\'"\这行不通。我收到错误消息说这样的用户不存在。
我尝试使用[Regex]::Escape(),但它不起作用。我尝试将$pass 放在双引号中,但它不起作用。我尝试像这样使用Start-Process:
Start-Process -Wait net -ArgumentList @("user", "testuser", $pass, "/add")
但它不起作用。我尝试运行net 命令而不使用前导&,但它不起作用。
我读过大约。 StackOverflow 上的 30 个问题在询问“powershell 转义命令参数”(显示的 197 个)后显示,但没有什么比我需要的更接近。也许我错过了什么,但 197 个问题很多。
编辑:
好的,所以我找到了这个:
https://github.com/PowerShell/PowerShell/issues/1995
如果不编写自定义函数并知道调用的是本机二进制文件还是 cmdlet 或其他东西,似乎几乎不可能做到正确。从来没有比说“我什至没有”更合适的时刻了。
编辑 2: 关于这种情况(用户创建和正确引用密码)Ansgar Wiechers 提供的链接显示了另一种创建本地用户帐户的方法,非常感谢。这并不意味着引用问题就消失了,只是意味着需要这样引用的情况少了一种。
【问题讨论】:
-
这是X-Y problem的经典案例。与其尝试转义用于
net user的任意密码,不如研究如何在 PowerShell 中正确创建本地用户帐户。net user是一种方法,但还有其他方法更适合处理任意密码字符串。 Related. -
@AnsgarWiechers:虽然学习 PowerShell 原生的做事方式总是有益的——因为它们通常提供描述性、标准化的语法和更强大的功能——但 PowerShell 对外部参数的错误引用没有任何借口程序:调用外部可执行文件——在这种情况下是
net.exe——是shell的核心任务之一,鉴于PowerShell [Core]是跨平台的,考虑到类Unix平台(不像Windows),这一点尤其重要拥有大量强大且高性能的实用程序(外部可执行文件)。 -
@AnsgarWiechers 引用:“考虑以下示例(忽略安全隐患):”。此外,如果不安装特性和/或功能,我找不到任何其他方法来创建用户。例如“New-LocalUser”在 Windows Server 2014 上不起作用,我必须支持它。就这样。
-
@AnsgarWiechers 您链接到的问题将
net user列为投票最多的答案。New-LocalUser是 PS 5.1,我充其量是 4.0,3.5 作为基线。提到的模块Carbon必须单独安装,我不能这样做。所以看来这不是X-Y problem的经典案例,我正在尝试做X,但除了做Y没有办法。 -
@mklement0 我的目的不是为引用地狱找借口。但是,我一直在想“使用有效的方法”。如果有其他(可行的)方法可以实现特定目标:不要浪费时间解决一种特定方法的局限性。
标签: powershell cmd escaping quoting