【问题标题】:When does WinNT:// provider query Active Directory? Or how to get SID of local group member if it is domain accountWinNT:// 提供程序何时查询 Active Directory?或者如果是域帐户,如何获取本地组成员的 SID
【发布时间】:2019-05-16 15:02:54
【问题描述】:

好的,所以我正在使用带有 DirectoryEntry 类的 WinNT 提供程序,通过 Members 属性枚举本地组的成员。

如果成员是本地帐户,则大概还会从本地计算机上的 SAM 中读取 DirectoryEntry。

但是,如果成员是域帐户,当我访问 DirectoryEntry 对象的属性时,提供程序是否会对 Active Directory 执行查询?

有没有办法区分这两种情况?例如,检查 DirectoryEntry 上的属性以查看它是否要从本地计算机 SAM 获取属性,或者通过查询域控制器来读取 Active Directory?

有没有办法在查询 Active Directory 的情况下获取成员的名称(甚至只是 SID)?

我正在尝试枚举大量服务器上的本地组,并且如果它们包含许多域用户帐户,我不想影响域控制器。

【问题讨论】:

    标签: c# .net active-directory ldap directoryentry


    【解决方案1】:

    您可以查询 Win32_GroupUser,这根本不应该命中 AD。然后你只需要做一点字符串解析就可以得到用户名、用户类型(用户/组)和来源(本地/域)。

    $Servers = 'Server1.domain.com','Server2.domain.com'
    $GMembers = ForEach($Server in $Servers){
        $BaseName=$Server.split('.')[0]
        Get-WmiObject -ComputerName $Server -Query "SELECT * FROM win32_GroupUser WHERE GroupComponent = ""Win32_Group.Domain='$BaseName',Name='Administrators'"""
    }
    $GMembers | 
        ?{$_.PartComponent -match '\\\\(.+?)\\.+?Win32_(.+?)\.Domain="(.+?)",Name="(.+?)"'}|
        %{
            [PSCustomObject]@{
                Server=$Matches[1]
                Domain=$Matches[3]
                Account=$Matches[4]
                AccountType=$Matches[2]
            }
        }
    

    【讨论】:

    • 哇哦!由于 Win32_UserAccount 和 Win32_Group 实例确实执行 LDAP 查询以获取域原则的属性,我假设 GroupUser 也会这样做,但我刚刚用 WireShark 进行了测试,似乎没有!太好了,这会做得很好。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多