8

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适用于所有用户。这使得如果不对每个用户进行进一步查询,就不可能区分启用和禁用用户。

4

3 回答 3

1

UserPrinciple 对象为此具有 bool Enabled 属性。

http://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.userprincipal_properties.aspx

// Add this to GetUserDetails
objUserDetails.EmployeeId = UserPrinical.EmployeeId;


// Then condition the add to only add enabled
if (objUserDetails.Enabled) {
    objUserDetails.Add(GetUserDetails(p.Name));
}
于 2013-01-18T19:38:08.513 回答
1

解决此问题的一种方法可能是首先使用该类搜索已启用用户PrincipalSearcher,然后使用 Principal 的方法IsMemberOf()

List<string> users = List<string>();
PrincipalContext pcContext = GetPrincipalContext();
GroupPrincipal grp = GroupPrincipal.FindByIdentity(pcContext, IdentityType.Name, "Domain Users");
UserPrincipal searchFilter = new UserPrincipal(pcContext){ Enabled = true }
PrincipalSearcher searcher = new PrincipalSearcher(searchFilter);
PrincipalSearchResult<Principal> results = searcher.FindAll();
foreach (Principal user in results)
    if (user.IsMemberOf(grp))
        users.Add(user.SamAccountName);
于 2015-12-21T02:57:45.190 回答
0

在 Enabled 属性的MSDN 页面上有一句话说:

如果主体尚未保存在存储中,则此属性返回 null。主体持久化后,默认启用设置取决于存储。AD DS 和 AD LDS 存储在持久化新主体时禁用它们,而 SAM 在持久化新主体时启用它们。应用程序只能将此属性设置为一个值,然后才能将其持久化到存储中。

如果默认值为 false ,也许它是相关的?

此外,MSDN 论坛上有一篇关于UserPrincipal.Enabled 的帖子为实际上已启用的帐户返回 False?这听起来和你的问题很相似。根据帖子,这里可能有一个解决方案:

我想我误解了。无视我之前发的内容。我想我知道发生了什么。GetMembers 方法显然没有加载 UserPrincipal 数据。我不知道是否有更好的解决方案,但以下工作(至少在我的 AD 上):

foreach (UserPrincipal user in group.GetMembers(false))
{
   UserPrincipal tempUser = UserPrincipal.FindByIdentity(context, user.SamAccountName);
   // use tempUser.Enabled
   // other code here
}
于 2013-08-11T01:28:29.387 回答