我们使用以下代码获取活动目录用户的组。
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
组,而我们为此类用户调用此方法时会返回一个空组。
请提出任何建议..
答案 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帐户的主要群组。