在脚本中的runa中执行PowerShell脚本



我需要基于检测到的环境以另一个用户的身份运行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之前的多个空格是如何被规范化为一个单个空格的。

原因是在Windows上只有双引号("...")在命令行上具有语法功能-'字符被逐字解释,因此通过

。因此,当-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字符串字面值,其内容随后按原样输出。

最新更新