PowerShell提权脚本原进程未终止问题求助
问题原因
用&调用提权脚本时,Exit只会终止被调用的提权脚本本身,而调用它的父脚本会继续执行后续代码,所以原非提权窗口不会退出。
解决办法
方法1:改用点源方式调用脚本
把调用语句从& path\to\Switch-ToAdmin.ps1改成:
. path\to\Switch-ToAdmin.ps1
点源(. )会让提权脚本在当前会话的上下文中执行,脚本里的Exit就会直接终止整个父进程,原窗口会关闭,只有提权后的新窗口继续运行。
方法2:优化提权脚本的参数传递(附带修复)
原脚本的参数处理逻辑有缺陷:只能传递参数名、丢失参数值,且多个参数时格式错误。可以改成下面的版本,同时确保Exit能正确终止父进程(配合点源调用):
# 检查是否已管理员身份运行 $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) if (-not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { # 获取调用者脚本路径 $callerStack = Get-PSCallStack | Select-Object -Skip 1 -First 1 $OGScript = $callerStack.ScriptName if (-not $OGScript) { Write-Error "无法获取调用脚本路径,仅支持从脚本中调用此功能" exit 1 } # 处理调用者的参数(保留参数名和值) $paramArgs = @() foreach ($key in $callerStack.InvocationInfo.BoundParameters.Keys) { $value = $callerStack.InvocationInfo.BoundParameters[$key] # 处理带空格的参数值,添加引号 if ($value -is [string] -and $value.Contains(' ')) { $paramArgs += "-$key `"$value`"" } else { $paramArgs += "-$key $value" } } $paramStr = $paramArgs -join ' ' # 构造提权命令 $workingDir = Split-Path -Path $OGScript -Parent $cmd = "-Command Set-Location `"$workingDir`"; & `"$OGScript`" $paramStr" # 启动提权进程 Start-Process -FilePath PowerShell.exe -Verb RunAs -ArgumentList $cmd # 终止当前会话(点源调用时生效) exit }
调用示例
在你的业务脚本开头添加:
# 确保替换为实际的脚本路径 . C:\Scripts\Switch-ToAdmin.ps1 # 以下是你的业务代码 Write-Host "已以管理员身份运行"
内容的提问来源于stack exchange,提问作者gargoylebident
相关产品推荐
相关产品推荐

