如何使用PowerShell检查进程是否以提升权限运行?
如何用PowerShell判断进程是否以提升权限运行
嘿,我来帮你搞定这个问题!你需要判断进程是否以管理员权限运行,尤其是针对用-verb runas启动的控制面板任务(比如appwiz.cpl)对吧?首先得说明:你之前用Get-WmiObject查看进程路径的方法没法判断权限状态,得通过检查进程的安全令牌角色来实现。
核心原理
判断进程是否提升权限,本质是检查该进程的Windows身份令牌是否属于管理员内置角色。我们可以借助.NET的WindowsIdentity和WindowsPrincipal类来实现,这是最可靠的方式。
针对你的场景的解决方案
因为appwiz.cpl是控制面板项,它本身不是独立进程,而是由rundll32.exe启动的。所以我们需要检查对应的rundll32.exe进程是否处于提升状态:
# 目标进程名称(appwiz.cpl由rundll32.exe承载) $targetProcess = "rundll32.exe" # 获取所有同名进程 $processes = Get-CimInstance Win32_Process -Filter "Name='$targetProcess'" foreach ($proc in $processes) { # 检查进程是否以管理员权限运行 try { $processIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent($proc.ProcessId) $processPrincipal = New-Object System.Security.Principal.WindowsPrincipal($processIdentity) $isElevated = $processPrincipal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator) # 输出结果 [PSCustomObject]@{ ProcessName = $proc.Name ProcessId = $proc.ProcessId IsElevated = $isElevated Owner = $proc.GetOwner().User } } catch { Write-Warning "无法检查进程ID $($proc.ProcessId):$_" } }
如果你只是想检查当前脚本是否提升权限
如果你的需求是确认自己的PowerShell脚本是否以管理员身份运行,可以用更简洁的代码:
$currentPrincipal = New-Object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent()) $isCurrentElevated = $currentPrincipal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator) if ($isCurrentElevated) { Write-Host "当前脚本已以管理员权限运行" -ForegroundColor Green } else { Write-Host "当前脚本未提升权限" -ForegroundColor Red }
补充说明
- 当你用
Start-Process appwiz.cpl -Verb RunAs启动时,系统会弹出UAC提示(如果UAC未禁用),确认后对应的rundll32.exe进程才会以管理员权限运行。 - 推荐用
Get-CimInstance替代Get-WmiObject,因为WMI cmdlets已经被标记为过时,CIM是更现代的替代品。
内容的提问来源于stack exchange,提问作者Sumeet Singh
相关产品推荐
相关产品推荐

