管理员组的 SID 未显示在成员帐户中

SID for Administrators group doesn't show in a member account

现在,在我开始之前,我会告诉你一个秘密:这是在域控制器上。*

*上述陈述由于无关紧要而受到影响,因为本地管理员帐户和本地管理员组(在此问题的上下文和范围内)发生的唯一重大变化很小,不会改变结果足以要求差异化。


我在任何其他服务器上都没有遇到过这种麻烦,我愿意打赌背后的原因这是因为它在DC上。*

*同上所述的原因。接受的答案解释了不一致,是我的疏忽,而不是 Windows 安全或域控制器的体系结构(阅读 features)。


我一直在想一些关于如何检查脚本是否从本地管理员帐户调用的脚本,或者至少是由属于本地管理员的帐户调用的一些想法管理员组。

我已经重命名了本地管理员帐户,但是,我知道我可以通过键入以下命令查看脚本是否已被本地管理员帐户调用:

(New-Object System.Security.Principal.NTAccount('reserved')).Translate([System.Security.Principal.SecurityIdentifier]).Value

并且我可以查看 SID 是否以 -500 结尾。

当我通过键入 运行 条件来查看调用帐户是否属于管理员组(范围更大)时出现问题:

PS> [bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).Groups -match "S-1-5-32-544")
PS> False

快速查看它使用的是哪个帐户:

PS> $env:username
PS> reserved

或者不必要的复杂方式(虽然我有时更喜欢它):

PS> Write-Host ((Get-WmiObject Win32_Account | ?{$_.SID.Substring($_.SID.Length-4,4) -eq '-500'}).Caption).Split("\",2)[1] -fore GREEN
PS> reserved

我什至输入:

PS> net user reserved

它告诉我 Local Group Memberships *Administrators

我打开 ADUC (dsa.msc),然后查看 Builtin 容器并双击 Administrators 组。我 select Members 标签和 lo,看,reserved 居然是一个会员!

所以,回顾一下:

  1. 通过键入 net user reserved,我能够验证它是本地管理员组的一部分

  2. 我查看了 ADUC 并确认保留是内置管理员组的成员

  3. 我通过验证以 S-1-5... 开头并以 ...-500

  4. 结尾的 SID 来确保保留确实是本地管理员帐户
  5. 为了更进一步,我通过键入 Get-ADGroup -Identity "Administrators" 确保 SID 与名为 "Administrators" 的 Active Directory 组匹配。然后我输入 Get-ADGroupMember -Identity "Administrators" 并确保列出了 reserved(它和 SID 匹配!)。

  6. 当我检查是否在该帐户的组中找到众所周知的管理员组 SID(通过获取当前的 Windows 标识)时,它说它不是' t.

什么给了?

为什么我得到的所有指示都表明它实际上是本地管理员组的成员,但在该帐户的组中找不到该 SID?

当一台计算机被提升为域控制器时,该计算机上不再有本地用户或组。成员计算机有本地用户和组,也可以使用域用户和组进行认证,但在DC上,只有域对象。

另请参阅:https://serverfault.com/a/264327/236470

我偶然发现了一些东西,我知道了这个问题的答案。为了那些来这里寻求帮助的人,这里是我的问题的答案:

非常简单——关于 Powershell——如果管理员组 SID (S-1-5-32-544) 没有出现在用户组中,那就是第一行表明该脚本不是 运行 管理凭据。

例如,当我输入:

([Security.Principal.WindowsIdentity]::GetCurrent()).Groups

并且我没有看到列出的管理员组 SID 尽管我确实知道我登录的帐户是管理员组的成员,这意味着当前的 Powershell 进程没有管理凭据。

如果您单击 Run As Administrator 并键入与上面相同的内容,您将看到它在 Groups 中列出了管理员组 SID。

我遇到不一致的原因仅仅是因为我不是 运行 作为管理员的 Powershell 进程。

因此,简而言之,您可以通过几种方法来检查以验证您当前的 Powershell 会话是否具有管理员凭据。第一个可以在互联网上无数的网站上找到并且很常见(我不是写这个):

$myWindowsID = [Security.Principal.WindowsIdentity]::GetCurrent()
$myWindowsPrincipal = New-Object Security.Principal.WindowsPrincipal($myWindowsID)
$adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator
if($myWindowsPrincipal.IsInRole($adminRole)) {
    \ TODO: Process is running as Administrator
    Clear-Host
    } else {
        $newProcess = New-Object System.Diagnostics.ProcessStartInfo "Powershell"
        $newProcess.Arguments = "& '" + $script:MyInvocation.MyCommand.Path + "'"
        $newProcess.Verb = "runas"
        [System.Diagnostics.Process]::Start($newProcess)
        exit
        }

这是另一种方式(我做过写的):

[Security.Principal.WindowsIdentity]::GetCurrent() | %{
    if($_.Groups -contains "S-1-5-32-544") {
        \ TODO: Process is running as Administrator
        Clear-Host
        } else {
            Start Powershell -ArgumentList "& '$MyInvocation.MyCommand.Path'" -Verb runas
            exit
            }
        }

# The Foreach-Object (%) could be replaced with another pipeline filter

我看到很多人问这个问题,而且由于 Powershell 对许多系统管理员(尤其是没有编程背景的系统管理员)有吸引力,我真的认为这对其他人来说会派上用场。