如何在PowerShell中捕获用户取消UAC提权提示的操作?
问题:PowerShell提权脚本无法捕获用户取消UAC的操作
在PowerShell中,尝试通过以下代码以管理员权限运行另一个脚本:
try{ powershell -ExecutionPolicy Bypass -Command "Start-Process Powershell -Verb RunAs -Wait -ErrorAction Ignore -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File `\"path\to\file`\"'" } catch{ # I can't get to here - thats my problem! }
当用户允许UAC提示时,脚本能正常提权运行;但用户取消提示时,触发的错误无法被try/catch块捕获,脚本会直接继续执行。尝试调整ErrorAction参数也无法解决该问题,需要找到能捕获用户取消UAC操作的方法。
解决方案
核心问题分析
原代码通过嵌套调用powershell进程执行Start-Process,外层try/catch无法捕获内层操作的错误:
- 内层
Start-Process使用-ErrorAction Ignore直接忽略了UAC取消的错误; - 外层调用的
powershell进程不会将内层的错误传递为自身的终止错误,导致try/catch无法触发。
改进方案
直接在当前脚本中调用Start-Process,结合-PassThru参数获取进程对象,同时通过-ErrorAction Stop将错误转为终止错误,配合try/catch捕获异常,还可通过进程的ExitCode判断执行结果:
try { # 直接启动提权的PowerShell进程,获取进程对象 $elevatedProcess = Start-Process powershell -Verb RunAs -Wait -PassThru -ErrorAction Stop ` -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File "path\to\your\script.ps1"' # 检查进程退出码,非0则判定为执行失败 if ($elevatedProcess.ExitCode -ne 0) { throw "提权脚本执行失败,退出码:$($elevatedProcess.ExitCode)" } } catch { # 捕获包括UAC取消在内的所有错误 Write-Host "操作失败:$_" }
关键说明
-ErrorAction Stop:将Start-Process遇到的错误(如用户取消UAC)转为终止错误,确保能被try/catch捕获;-PassThru:返回启动的进程对象,方便后续检查退出码,区分是UAC取消还是脚本自身执行出错;- 取消嵌套调用:避免外层进程屏蔽内层错误的传递,让错误直接暴露在当前脚本的上下文里。
内容的提问来源于stack exchange,提问作者danKV
相关产品推荐
相关产品推荐

