获取给定UserPrincipal的组列表

时间:2012-04-20 10:15:44

标签: c# active-directory userprincipal

我想获取用户所在的群组列表。

这是我的代码:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "mydomain.ac.uk",   "DC=mydomain,DC=AC,DC=UK", "user", "password");

UserPrincipal user = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "MyUser");

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

foreach(Principal p in results)
{
   Response.Write(p.Name);
}

当我跑步时,我在行Response.Write(p.Name);

处收到以下错误
  

System.Runtime.InteropServices.COMException:指定的目录服务属性或值不存在。

当我检查结果的计数时,它返回9,第一组是DomainUsers

如何迭代列表中的所有9个组?感谢。

以下是我获得的用户列表:

enter image description here

2 个答案:

答案 0 :(得分:5)

如PrincipalContext Class中所述省略LDAP容器属性时,运行代码的用户必须具有对默认User容器(即CN=Users,DC=yourDomain,DC=COM)和Computers容器的读取权限(即CN=Computers,DC=yourDomain,DC=COM)。

如果用户没有所需的权限,您将收到以下错误消息:

  

指定的目录服务属性或值不存在

     
      
  • 'context.Container'抛出了'System.NullReferenceException'字符串的异常   {System.NullReferenceException}

  •   
  • ((new System.Linq.SystemCore_EnumerableDebugView(groups))。Items [5])。Description'   抛出了类型的例外   'System.Runtime.InteropServices.COMException'字符串   {System.Runtime.InteropServices.COMException}

  •   

答案 1 :(得分:1)

尝试类似

的内容
foreach(Principal p in results)
{ 
   if (p is GroupPrincipal) 
      Response.Write(p.DisplayName); 
}

我知道这听起来很愚蠢,但过去它对我有用。您的结果看起来只是实际上找到了1个安全组和8个“其他”类型的组。那些“其他”群体可能不具备这些属性。