我需要基于检测到的环境以另一个用户的身份运行PowerShell脚本(用户将实际执行验证)。该脚本利用智能卡进行登录。我遇到的问题是,当PowerShell.exe实例从runas启动时,它只是打印我的命令,而不是实际运行它。
注意:文件路径的空格用双'转义,只是没有在这里显示,因此在实际命令中转义了' "。也用过' ' "
的例子:
Start-Process runas.exe "/netonly /smartcard /user:domain$env:USERNAME ""powershell.exe -noexit -Command `'&$filePath -arg1 -arg2`' "" "
或
Start-Process runas.exe "/netonly /smartcard /user:domain$env:USERNAME ""powershell.exe -noexit -File `'$filePath -arg1 -arg2`' "" "
File path指向相同的.ps1文件。目录类似于:c: users 用户名 my Documentsscript.ps1
当它运行时,我只是得到一个脚本窗口,它实际上并不运行,它只是打印文件名。我也尝试过使用-File,但这只是崩溃(不管-noexit)。runas位工作得很好,我得到了我的智能卡提示等等,这只是我正在努力的实际PowerShell启动。
直接在PowerShell命令行中调用它们就可以了,但是当在。ps1文件中,它就不起作用了。
任何帮助都将非常感激。
通常没有理由使用Start-Process
来运行像runas.exe
这样的控制台应用程序-除非您明确希望应用程序在新窗中异步运行(默认情况下)-请参阅此回答以获取更多信息。
去掉Start-Process
简化了引用:
runas.exe /netonly /smartcard /user:domain$env:USERNAME "powershell.exe -noexit -File `"$filePath`" -arg1 -arg2"
注意-不幸的是-需要手动-转义嵌入的
"
字符。(`"
),至少在v7.1版本之前是需要的——参见这个答案。
至于你试过的:
在Windows上,从在PowerShell外部(例如通过runas.exe
)将'...'
封闭的字符串传递给PowerShell CLI的-Command
(-c
)参数,导致它被解释为逐字的PowerShell字符串,按原样打印其内容(除了空格规范化)。
cmd.exe
中运行以下命令来验证这一点,例如:
C:>powershell -c 'Get-Date; whatever I type here is used as-is - almost'
Get-Date; whatever I type here is used as-is - almost
请注意,单词almost
之前的多个空格是如何被规范化为一个单个空格的。
"..."
)在命令行上具有语法功能-'
字符被逐字解释,因此通过
。因此,当-Command
(-c
)参数看到它的参数——命令行解析之后的和然后将结果的空格连接的,可能是双引号去掉的参数解释为PowerShell源代码时,'...'
的span被解释为逐字的PowerShell字符串,像往常一样(参见概念上的about_Quoting_Rules帮助主题,讨论PowerShell字符串文字的类型)。
具体而言:
'Get-Date; whatever I type here is used as-is - almost'
被PowerShell CLI解析为以下参数(!):'Get-Date;
,whatever
,I
,type
,here
,is
,used
,as-is
,-
,almost'
-注意关于这些参数之间的空白量的信息是如何在处理过程中丢失的
这些参数然后与单个空格连接形成字符串,然后PowerShell将解释为PowerShell源代码,产生:
'Get-Date; whatever I type here is used as-is - almost'
这相当于一个逐字(单引号)PowerShell字符串字面值,其内容随后按原样输出。