Ldap查询特定于组的所有成员

时间:2016-01-06 22:02:26

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

我希望获得属于特定群组的用户列表' groupName'传递给私有方法。

 DirectoryEntry de = new DirectoryEntry("LDAP://DC=xxxx,DC=net"); // Root Directory //
 var ds = new DirectorySearcher(de);
 ds.PropertiesToLoad.Add("SAMAccountName");
 ds.PropertiesToLoad.Add("member");
 ds.Filter = "(&(objectClass=group)(SAMAccountName=" + groupName + "))";
 SearchResultCollection AllGroupUsers;     
 AllGroupUsers = ds.FindAll();

查询返回3个属性: - adspath,accountName和member。 成员是我真正追求的。我访问成员属性及其值,如下面的代码所示: -

 if (AllGroupUsers.Count > 0)
   {
     ResultPropertyValueCollection values = AllGroupUsers[0].Properties["member"];

但这里发生了一些奇怪的事情。在等号的RHS上,AllGroupUsers具有特定成员的值为" CN = Mike Schoomaker R,........"

在等号的LHS上,值为" CN = Mike Schoomaker(OR),....."

我不太确定这是怎么可能的......对于AllGroupUsers下的每一个值都没有发生...只有我知道的事情是它发生在活动目录上的外部用户...可以有谁告诉我如何解决这个问题并得到实际的firstName,LastName和MiddleInitial?

2 个答案:

答案 0 :(得分:1)

using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
    // find a user
    using (var group = GroupPrincipal.FindByIdentity(ctx, "groupName"))
    {
        if (group == null)
        {
            MessageBox.Show("Group does not exist");
        }
        else
        {
            var users = group.GetMembers(true);
            foreach (UserPrincipal user in users)
            {
                //user variable has the details about the user 
            }
         } 
      }
}

答案 1 :(得分:0)

要获取用户,而不是群组,您应设置DirectoryEntry对象并使用相应的属性(例如displayNamesngivenNameinitials

示例:

...    
AllGroupUsers = ds.FindAll();
if (AllGroupUsers.Count > 0) {
    ResultPropertyValueCollection values = AllGroupUsers[0].Properties["member"];
    foreach (string s in values) 
    {
        DirectoryEntry u = new DirectoryEntry("LDAP://" + s);  
        Console.WriteLine(u.Properties["displayName"].Value);
    }
}