如何判断用户是否拥有管理员权限(脚本未以高权限运行)
如何正确检测PowerShell中的管理员权限(含嵌套组场景)
我尝试了网上多种解决方案(部分方案未明确是检测脚本是否以高权限运行,还是检测无需UAC验证即可提权的用户),例如以下代码:
PS C:\Users\xxxxxxxx.adm> (new-object security.principal.windowsprincipal([security.principal.windowsidentity]::getcurrent())).isinrole([security.principal.windowsbuiltinrole]::administrator) PS C:\Users\xxxxxxxx.adm> (([security.principal.windowsidentity]::getcurrent().groups).value -contains 'S-1-5-32-544')
这些代码在未提权的域管理员账号下显示false,无管理员权限的域账号下也显示false,但在提权运行时均显示true。
我的环境中,帮助台管理员权限通过双重嵌套组提供,而非域管理员组,该组已添加至工作站的管理员组中。请问如何实现所需的权限检测?
解决方案:区分两种权限检测场景
你需要明确自己要检测的是当前进程是否已提权运行,还是用户本身是否拥有本地管理员权限(即使当前进程未提权),以下是对应实现:
1. 检测当前进程是否以高权限(管理员身份)运行
这是你之前代码实现的逻辑,只有当进程通过UAC提权后才会返回true,适合判断脚本是否需要重新启动提权:
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) $isElevated = $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) $isElevated
2. 检测用户是否拥有本地管理员权限(无论进程是否提权)
针对你的嵌套组场景,需要递归检查用户的所有组(包括嵌套组)是否属于本地管理员组(SID: S-1-5-32-544):
function Test-IsLocalAdmin { $currentIdentity = [Security.Principal.WindowsIdentity]::GetCurrent() $localAdminSid = New-Object Security.Principal.SecurityIdentifier('S-1-5-32-544') foreach ($group in $currentIdentity.Groups) { try { $groupSid = New-Object Security.Principal.SecurityIdentifier($group.Value) if ($groupSid.Equals($localAdminSid)) { return $true } # 递归检查嵌套组 $groupPrincipal = New-Object Security.Principal.WindowsPrincipal($groupSid) if (Test-IsGroupMemberOfAdmin $groupPrincipal) { return $true } } catch { continue } } return $false } function Test-IsGroupMemberOfAdmin { param([Security.Principal.WindowsPrincipal]$groupPrincipal) $localAdminSid = New-Object Security.Principal.SecurityIdentifier('S-1-5-32-544') foreach ($group in $groupPrincipal.Identity.Groups) { $groupSid = New-Object Security.Principal.SecurityIdentifier($group.Value) if ($groupSid.Equals($localAdminSid)) { return $true } # 继续递归检查更深层级的嵌套组 $nestedGroupPrincipal = New-Object Security.Principal.WindowsPrincipal($groupSid) if (Test-IsGroupMemberOfAdmin $nestedGroupPrincipal) { return $true } } return $false } # 调用检测 Test-IsLocalAdmin
这个函数会遍历用户的所有直接/间接组,只要其中任何一个组属于本地管理员组,就会返回true,完美适配你的双重嵌套组场景。
3. 补充:快速验证用户的权限状态
如果你需要同时判断用户权限和当前进程状态,可以结合上述两种检测:
$isLocalAdmin = Test-IsLocalAdmin $isElevated = (New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) if ($isLocalAdmin -and -not $isElevated) { Write-Host "用户具备本地管理员权限,当前进程未提权" } elseif ($isLocalAdmin -and $isElevated) { Write-Host "用户以管理员权限运行进程" } else { Write-Host "用户无本地管理员权限" }
内容的提问来源于stack exchange,提问作者user66001
相关产品推荐
相关产品推荐

