【问题标题】:Counting Active Directory Security group members计算 Active Directory 安全组成员
【发布时间】:2011-06-25 00:54:09
【问题描述】:

首先,我必须枚举当前用户的所有 AD 组。获取 SID 和名称很容易:

foreach(var group in WindowsIdentity.GetCurrent().Groups)
{
   var sid = new SecurityIdentifier(group.Value);
   string name = (group.Translate(typeof(NTAccount)) as NTAccount).Value;
}

然后我需要确定每个组中的成员数量,但我无法让它工作。我想我需要一种方法来获取当前用户组的专有名称。知道如何获得吗?

到目前为止我所做的:我尝试了这样的 WMI 查询,但它没有返回任何结果,因为我需要完全限定的域名,但 NTAccount 只给了我“友好”域帐户(域\组):

SELECT PartComponent FROM Win32_GroupUser 
WHERE (GroupComponent = "Win32_Group.Domain='somedomain', Name='somegroup'")

然后我尝试 LDAP,通过绑定到组的 SID 来解决丢失的路径/可分辨名称:

var adGroupEntry = new DirectoryEntry(String.Format("LDAP://<SID={0}>", group.Value));
if (adGroupEntry != null)
{
  IEnumerable members = adGroupEntry.Invoke("Members", null) as IEnumerable;
  if (members != null)
  {
    foreach (object member in members)
    {
      noOfMembers++;
    }
  }
}

它找到组,name 属性返回正确的值,但是Members 从不包含任何元素。如果我知道组的完整 LDAP 路径(就像我硬编码时一样),上面的代码实际上会产生组中正确数量的用户。

我在这里缺少什么?我对 Active Directory 或 WMI 不是很熟悉。

限制:

  • 我无法对任何域名或 LDAP 路径进行硬编码。
  • 我受限于.NET 2.0,所以我不能使用System.DirectoryServices.AccountManagement

【问题讨论】:

    标签: .net active-directory wmi directoryservices


    【解决方案1】:

    我可以在我的环境中重现您的问题。对我来说,这听起来像是 ADSI 中的一个错误。

    如果您同时使用serverless bindingSID binding,则返回的COM 对象不起作用。

    我可以通过不使用无服务器绑定来解决这个问题。即改用这个LDAP://*yourdomain.com*/&lt;SID={0}&gt;

    我也可以通过再次绑定对象来解决这个问题。

    var adGroupEntry = new DirectoryEntry(String.Format("LDAP://<SID={0}>",group.Value));
    string dn = adGroupEntry.Properties["distinguishedName"].Value as string;
    DirectoryEntry de = new DirectoryEntry("LDAP://" + dn);
    if (de != null)
    {
        IEnumerable members = de.Invoke("Members", null) as IEnumerable;
        if (members != null)
        {
            foreach (object member in members) 
            {
                noOfMembers++;     
            }   
        } 
    } 
    

    【讨论】:

    • 非常感谢您测试我的代码和解决方法!它实际上也为我解决了这个问题 :) 我没想到能够从属性中获取可分辨名称,因为此信息的类型化属性在 QuickWatch 中不包含有用的内容。
    猜你喜欢
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多