域用户组未获取活动目录用户

时间:2012-04-02 04:58:49

标签: c# asp.net active-directory

我们使用以下代码获取活动目录用户的组。

StringCollection groups = new StringCollection();

try
{
   using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domainName, userName, password))
   {
      //find user roles
      UserPrincipal user = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, loginUserName);

      if (user != null)
      {
         DirectoryEntry de = (DirectoryEntry)user.GetUnderlyingObject();
         object obGroups = de.Invoke("Groups");                        

         foreach (object ob in (IEnumerable)obGroups)
         {
            DirectoryEntry obGpEntry = new DirectoryEntry(ob);                            
            groups.Add(obGpEntry.Name);
         }    
      }
   }
}
catch (Exception e)
{
}

这几乎按预期工作。但是,当我们使用Domain Users组检查用户时,该方法并未返回组名称。有些用户只使用此Domain Users组,而我们为此类用户调用此方法时会返回一个空组。

请提出任何建议..

1 个答案:

答案 0 :(得分:2)

这是一个众所周知且有文档记载的“遗漏”,即所谓的主要群组 从此代码中的Groups方法返回。有一些相当神秘的方法 - 或尝试另一种方法:

如果您使用的是.NET 3.5及更高版本,则应该查看System.DirectoryServices.AccountManagement(S.DS.AM)命名空间。在这里阅读所有相关内容:

基本上,您可以定义域上下文并轻松在AD中查找用户和/或组:

// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// find a user
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName");

if(user != null)
{
   // the call to .GetAuthorizationGroups() will return **all** groups that
   // user is a member of - including the primary group and all nested 
   // group memberships, too!
   var result = user.GetAuthorizationGroups();
}

新的S.DS.AM让您可以轻松地与AD中的用户和群组一起玩!

更新:如果您坚持使用旧的旧版技术,请查看this blog post by Ryan Dunn,其中详细说明了如何在C#中获取AD帐户的主要群组。