PowerShell如何使用Start-Process调用共享文件并传递ExecutionPolicy Bypass参数
问题排查与解决方案
错误原因
- 路径拼接语法错误:你在硬编码路径
"\\server\dir\foo".ps1中将.ps1后缀放在了引号外侧,同时额外拼接了$MyInvocation.MyCommand.Name和多余的空字符串,最终生成的-File参数值是无效的错误路径,自然找不到文件。 - 提权后PowerShell默认工作目录为
C:\Windows\System32,如果未使用脚本的完整绝对路径,也会触发路径不存在报错。
修正后的实现代码
直接用$MyInvocation.MyCommand.Definition获取当前脚本的完整绝对UNC路径,不需要硬编码路径,同时正确添加执行策略绕过参数即可解决确认提示问题:
$principal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) if($principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { # 原有业务逻辑保留即可 Get-ChildItem | ForEach-Object { # 你的安装执行逻辑 } } else { # 用数组传递参数可避免引号转义错误,比字符串拼接更稳定 Start-Process -FilePath "powershell.exe" -ArgumentList @( "-ExecutionPolicy Bypass", "-NoProfile", "-File `"$($MyInvocation.MyCommand.Definition)`"" ) -Verb RunAs # 提权启动后直接退出当前未授权的进程 exit }
优化建议
- 如果你的脚本需要接收外部传入参数,可以在ArgumentList最后追加
$args的序列化内容,避免提权后参数丢失。 - 可以添加
-WindowStyle Hidden参数到ArgumentList中,隐藏中间弹出的PowerShell窗口,优化使用体验。 - 域环境下可通过组策略配置对应共享路径的脚本执行信任策略,不需要每次都加Bypass参数,安全性更高。
内容的提问来源于stack exchange,提问作者Mungle
相关产品推荐
相关产品推荐

