LDAP查询列出所有组用户是?的成员?

时间:2009-09-04 18:04:10

标签: active-directory ldap username active-directory-group

鉴于用户名,我将如何编写将返回该用户所属的所有组的LDAP查询?

2 个答案:

答案 0 :(得分:4)

您使用的是.NET 3.5吗?

如果是这样,请查看这篇优秀的MSDN文章Managing Directory Security Principals in the .NET Framework 3.5,该文章展示了.NET 3.5中用户和组管理的新功能。

在这种情况下,您需要一个主要上下文(例如您的域名):

PrincipalContext domainContext = 
   new PrincipalContext(ContextType.Domain, "YourDomain");

然后你可以很容易地找到用户:

UserPrincipal user = UserPrincipal.FindByIdentity(principalContext, "username");

和“UserPrincipal”对象有一个名为“GetAuthorizationGroups”的方法,它返回用户所属的所有组:

PrincipalSearchResult<Principal> results = user.GetAuthorizationGroups();

// display the names of the groups to which the
// user belongs

foreach (Principal result in results)
{
    Console.WriteLine("name: {0}", result.Name);
}

很简单,是吗?

在3.5之前的.NET中,或者在其他语言的“直接”LDAP(PHP,Delphi等)中,它的工作量要大得多。

马克

答案 1 :(得分:1)

以下是获取群组信息的另一种方式:

确保为System.DirectoryServices添加引用。

DirectoryEntry root = new DirectoryEntry("LDAP://OU=YourOrganizationOU,DC=foo,DC=bar");

DirectoryEntry user = GetObjectBySAM("SomeUserName", root);

if (user != null)
{
  foreach (string g in GetMemberOf(user))
  {
    Console.WriteLine(g);
  }
}

以下方法获取用户条目并返回字符串列表,该列表是用户所属的组。

public List<string> GetMemberOf(DirectoryEntry de)
{
  List<string> memberof = new List<string>();

  foreach (object oMember in de.Properties["memberOf"])
  {
    memberof.Add(oMember.ToString());
  }

  return memberof;
}

public DirectoryEntry GetObjectBySAM(string sam, DirectoryEntry root)
{
  using (DirectorySearcher searcher = new DirectorySearcher(root, string.Format("(sAMAccountName={0})", sam)))
  {
    SearchResult sr = searcher.FindOne();

    if (!(sr == null)) return sr.GetDirectoryEntry();
    else
      return null;
  }
}