计算Active Directory安全组成员

时间:2011-02-10 17:31:07

标签: .net active-directory wmi directoryservices

首先,我必须枚举当前用户的所有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只给我“友好” “域帐户(DOMAIN \ group):

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

1 个答案:

答案 0 :(得分:1)

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

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

我可以通过不使用无服务器bindnig来解决这个问题。即使用此LDAP://*yourdomain.com*/<SID={0}>代替

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

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++;     
        }   
    } 
} 
相关问题