Powershell 管理员组的SID不为';不显示在会员帐户中

Powershell 管理员组的SID不为';不显示在会员帐户中,powershell,active-directory,sid,Powershell,Active Directory,Sid,现在,在我开始之前,我将告诉你一个秘密:这是在域控制器上* *由于本地管理员帐户和本地管理员组(在本问题的上下文和范围内)发生的唯一重大变化是最小的,并且不会改变结果,因此不需要区分,因此上述声明受到影响。 我在其他任何一台服务器上都没有遇到这种问题,我愿意打赌,这背后的原因是因为它在DC上。* *原因同上。接受的答案解释了不一致性,这是我的疏忽,而不是Windows安全或域控制器的体系结构(读取功能)。 关于如何检查脚本是否从本地管理员帐户调用,或者至少是由本地管理员组中的帐户调用,我一直在

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

*由于本地管理员帐户和本地管理员组(在本问题的上下文和范围内)发生的唯一重大变化是最小的,并且不会改变结果,因此不需要区分,因此上述声明受到影响。

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

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

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

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

(New-Object System.Security.Principal.NTAccount('reserved')).Translate([System.Security.Principal.SecurityIdentifier]).Value
PS> [bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).Groups -match "S-1-5-32-544")
PS> False
我可以看到SID是否以
-500
结尾

当我通过键入以下内容运行条件以查看调用帐户是否属于Administrators组(范围更大)时,就会出现问题:

(New-Object System.Security.Principal.NTAccount('reserved')).Translate([System.Security.Principal.SecurityIdentifier]).Value
PS> [bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).Groups -match "S-1-5-32-544")
PS> False
快速查看所使用的帐户:

PS> $env:username
PS> reserved
或者不必要的复杂方式(尽管我有时更喜欢):

我甚至输入:

PS> net user reserved
它告诉我
本地组成员资格*管理员

我调出ADUC(
dsa.msc
),查看
内置的
容器并双击Administrators组。我选择了Members标签,看到,
reserved
实际上是一个成员

因此,请重述一下:

  • 通过键入
    net user reserved
    ,我可以验证它是否属于本地管理员组

  • 我查看了ADUC,确认reserved是内置管理员组的成员

  • 我通过验证SID以
    S-1-5…
    开始,以
    结束…-500
    来确保保留的确实是本地管理员帐户

  • 为了更进一步,我通过键入
    Get-ADGroup-Identity“Administrators”
    确保SID与名为“Administrators”的Active Directory组匹配。然后,我键入了
    Get-ADGroupMember-Identity“Administrators”
    ,并确保
    reserved
    已列出(它是,SID匹配!)

  • 当我检查在该帐户的组中是否找到著名的Administrators组SID时(通过获取当前Windows标识),它会说没有找到

  • 有什么好处


    为什么每次都有迹象表明它实际上是本地Administrators组的成员,但在帐户组中找不到SID?

    当计算机升级为域控制器时,计算机上不再有本地用户或组。成员计算机具有本地用户和组,也可以使用域用户和组进行身份验证,但在DC上,只有域对象


    另请参见:

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

    非常简单——对于Powershell——如果管理员组SID(S-1-5-32-544)未显示在用户组中,这是脚本未使用管理凭据运行的第一行指示。

    例如,当我键入时:

    ([Security.Principal.WindowsIdentity]::GetCurrent()).Groups
    
    而且我没有看到列出管理员组SID,即使我知道我登录的帐户是管理员组的成员,这意味着当前Powershell进程没有管理凭据

    如果单击
    以管理员身份运行
    并键入与上述相同的内容,您将看到它在
    中列出了管理员组SID

    我遇到不一致的原因很简单,因为我没有以管理员身份运行Powershell进程

    因此,简而言之,有几种方法可以检查您当前的Powershell会话是否具有管理员凭据。第一个出现在互联网上无数的网站上,非常普遍(我没有写这一个):

    这是另一种方式(我确实写了这一种):


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

    Dang,比我快一分钟。这是正确的,但这并不能解释列表中的#4。@Rincewind保留用户的主要组是什么?@briantist主要组是域管理员。但是,它仍然列出作为管理员(本地)成员的身份,并且仍然找到本地管理员组和帐户。是否验证了
    [Security.Principal.WindowsIdentity]::GetCurrent()
    [Security.Principal.WindowsIdentity]::GetCurrent().Groups
    就是你想象的吗?@AnsgarWiechers这就是我做
    [bool]([System.Security.Principal.WindowsIdentity]::GetCurrent()).Groups-match“S-1-5-32-544”)时发生的事情
    。这是在搜索当前windows标识(保留),查找组SID,并查看是否找到管理员的已知SID(S-1-5-32-544)。它返回了
    false
    [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