如何为带RunAs的Start-Process添加-executionpolicy bypass参数?
解决PowerShell提权时添加-ExecutionPolicy Bypass参数的问题
你之前的写法错误在于把-ExecutionPolicy Bypass放到了脚本调用的命令字符串里,但实际上这个参数是PowerShell.exe的启动参数,需要直接传递给新启动的PowerShell进程,而不是作为脚本内部的执行命令。
直接用参数数组传递是最可靠的方式,能避免路径含空格时的引号混乱,修改后的代码如下:
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { # 构建PowerShell启动参数数组:先指定执行策略,再指定要运行的脚本文件 $arguments = @( "-ExecutionPolicy", "Bypass", "-File", $myInvocation.MyCommand.Definition ) Start-Process PowerShell -Verb RunAs -ArgumentList $arguments } else { Get-ExecutionPolicy Pause }
如果习惯用字符串形式传递参数,也可以这样写(注意路径的引号转义):
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { $scriptPath = $myInvocation.MyCommand.Definition $arguments = "-ExecutionPolicy Bypass -File `"$scriptPath`"" Start-Process PowerShell -Verb RunAs -ArgumentList $arguments } else { Get-ExecutionPolicy Pause }
两种写法都能让提权后的PowerShell进程以Bypass执行策略运行当前脚本,不会出现窗口闪退的问题。
内容的提问来源于stack exchange,提问作者user66001
相关产品推荐
相关产品推荐

