【发布时间】:2013-01-17 14:05:43
【问题描述】:
我正在使用System.DirectoryServices.AccountManagement.dll 处理 Active Directory
获取“域用户”组中的所有用户。
这将返回域中的所有用户,但我只需要获取已启用的用户。
这里是一些示例代码:
List<string> users = new List<string>();
PrincipalContext pcContext = GetPrincipalContext();
GroupPrincipal grp = GroupPrincipal.FindByIdentity(pcContext,
IdentityType.Name,
"Domain Users");
foreach (Principal user in grp.GetMembers(true).OfType<UserPrincipal>())
{
if (user.Enabled != false)
{
users.Add(user.Name);
}
}
其他组工作正常,但是当组是“域用户”时,Enabled 属性的值对于所有用户都是false。这使得如果不对每个用户进行进一步查询,就无法区分启用和禁用用户。
【问题讨论】:
-
只需要账号名吗?是否需要使用 AccountManagement 命名空间?除了存储名称之外,您是否对 UserPrincipal 对象执行任何操作?我只是问,因为使用 DirectoryServices 命名空间和具有 LDAP 过滤器的 DirectorySearcher 可能会更好地满足您的要求,例如: (&(objectclass=user)(memberOf=CN=Domain Users,dc=company,dc=com)(! (userAccountControl:1.2.840.113556.1.4.803:=2))) 这将返回该组中启用的所有用户。
-
randcd:我更喜欢使用 AM 命名空间,因为它提供了非常简洁的 API。我当然可以使用 LDAP,但随后一切都变得更加复杂(尤其是在用户只是域用户的成员的情况下,因为它是他们的主要组,因为在这种情况下它没有在
memberOf中列出)。 -
ForEach 循环中的“Principal”实际上应该是“UserPrincipal”——“Enabled”不是在 Princpal 对象上可访问的方法或属性。至少不在 .net 4.6.1 中。这一切都可以通过 System.DirectoryServices.AccountManagement 命名空间来完成。
标签: c# active-directory directoryservices account-management