我正在使用System.DirectoryServices.AccountManagement.dll
来处理Active Directory 以获取“域用户”组中的所有用户。从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命名空间和DirectorySearcher与LDAP过滤器如下所示:(&(objectclass = user)(memberOf = CN = Domain Users,dc = company,dc = com) (userAccountControl:1.2.840.113556.1.4.803:= 2)))这将返回该组中启用的所有用户。 – randcd
randcd:我宁愿使用AM命名空间,因为它提供了一个非常干净的API。我当然可以使用LDAP,但是一切都变得更加复杂(特别是在用户只是域用户的成员的情况下,因为这是他们的主要组,因为它没有在'memberOf'中列出)。 – RobSiklos
ForEach循环中的“Principal”实际上应该是“UserPrincipal” - “Enabled”不是可在Princpal对象上访问的方法或属性。至少不在.net 4.6.1中。这可以通过System.DirectoryServices.AccountManagement命名空间完成。 – DtechNet