You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 04:17:11