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

如何判断用户是否拥有管理员权限(脚本未以高权限运行)

如何正确检测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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:55:07