首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查是否启用了UserPrincipal

检查是否启用了UserPrincipal
EN

Stack Overflow用户
提问于 2014-08-11 22:40:35
回答 3查看 6.6K关注 0票数 5

我正在使用C#代码查询Active Directory。我遇到的主要问题是确定帐户是否已被禁用。浏览许多在线文章,似乎不能仅仅依靠属性UserPrincipal.Enabled来确定用户帐户是否已启用。这很合理,因为它是一个可以为空的布尔值,但是当AD管理员禁用一个帐户时,它似乎确实被设置为false。我遇到的问题是,当我查询客户端的AD时,我发现大多数user accounts UserPrincipal对象对此属性返回false。因此,当我使用此代码检查帐户是否被禁用时:

代码语言:javascript
复制
private bool IsUserEnabled(UserPrincipal userPrincipal)
{
        bool isEnabled = true;

        if (userPrincipal.AccountExpirationDate != null)
        {
            // Check the expiration date is not passed.
            if (userPrincipal.AccountExpirationDate <= DateTime.Now)
            {
                Log.DebugFormat("User {0} account has expired on {1}", userPrincipal.DisplayName, userPrincipal.AccountExpirationDate.Value);
                isEnabled = false;
            }
        }

        if (userPrincipal.IsAccountLockedOut())
        {
            isEnabled = false;
            Log.DebugFormat("User {0} account is locked out", userPrincipal.DisplayName);
        }

        if (userPrincipal.Enabled != null)
        {
            isEnabled = userPrincipal.Enabled.Value;
            Log.DebugFormat("User {0} account is Enabled is set to {1}", userPrincipal.DisplayName, userPrincipal.Enabled.Value);
        }

        return isEnabled;
}

由于userPrincipal.Enabled检查,大多数帐户显示为禁用状态。

但是,如果我忽略了这一点,而只是依赖帐户到期日期和帐户锁定属性,那么我可能会错过使用Active Directory中的复选框禁用的人,该复选框仅禁用帐户-而不设置帐户到期日期。

enabled返回false的所有帐户实际上都是可以登录域的活动帐户。

如何检查账号是否已实际启用?

EN

回答 3

Stack Overflow用户

发布于 2016-12-08 12:06:51

我遇到了类似的问题,并且同样感到困惑!

我最初使用的是System.DirectoryServices.DirectorySearcher来搜索禁用用户。AD用户记录的状态(重新:禁用、锁定、密码过期等)存储在UserAccountControl属性中。您可以通过将UserAccountControl属性指定为筛选器的一部分,将筛选器传递给DirectorySearcher以查找禁用的帐户。

我从来不喜欢这种方法,因为它相当于使用一个魔术字符串和一些魔术数字来构建查询;例如,这是用于定位禁用帐户的过滤器:

代码语言:javascript
复制
 var searcher = new DirectorySearcher(dirEntry)
            {
                Filter = "(UserAccountControl:1.2.840.113556.1.4.803:=2)",
                PageSize = 50
            };

当我切换到使用UserPrincipal时,我很高兴地看到这个类上有一个很好用的"Enabled“属性。至少在我意识到它返回的值与DirectorySearcher筛选器返回的值不同之前是这样。

不幸的是,我能找到的确定帐户是否真正启用的唯一可靠方法是深入研究底层的DirectoryEntry对象,并直接检查UserAccountControl属性,即:

代码语言:javascript
复制
var result = (DirectoryEntry)userPrincipal.GetUnderlyingObject();
var uac = (int)result.Properties["useraccountcontrol"].Value;
var isEnabled = !Convert.ToBoolean(uac & 2);

注意-- UserAccountControl属性是一个“标志”枚举;UserAccountControl属性的所有可能值都可以在这里找到:https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx

我最终将上面的代码片段构建到一个小的扩展方法中;幸运的是,做这些额外的工作来检索UserAccountControl属性并没有明显地减慢我的AD查询。

票数 2
EN

Stack Overflow用户

发布于 2014-08-11 23:05:26

我可以在我的一个应用程序中告诉你什么对我有效。下面是我的应用程序中的一段代码:

代码语言:javascript
复制
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "domain.com"))
{
    using (UserPrincipal user = UserPrincipal.FindByIdentity(pc, "Doe, John"))
    {
        Console.Out.Write(user.Enabled);
    }
}

对我来说,这将准确地返回帐户是否已启用。

票数 0
EN

Stack Overflow用户

发布于 2018-07-30 19:33:44

我通过扩展结果得到了一个解决方案,然后转到基数并扩展基数。您将在那里看到启用了属性。然后右键单击该表达式并添加到监视,并将监视表达式复制到我的代码中。

代码语言:javascript
复制
  using (var context = new PrincipalContext(ContextType.Domain, "xyz.com", "Administrator", "xyz123"))
        {
            using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
            {
             foreach (var result in searcher.FindAll())
                {
                  DirectoryEntry de = result.GetUnderlyingObject() as DrectoryEntry;
             foreach (String key in de.Properties.PropertyNames)
                {
                   Console.WriteLine(key + " : " + de.Properties[key].Value);
                }
               Console.WriteLine("Enabled: "    +((System.DirectoryServices.AccountManagement.AuthenticablePrincipal)(result)).Enabled);
               Console.WriteLine("First Name: " + de.Properties["givenName"].Value);
                    }
                 }
             }
        Console.ReadLine();

((System.DirectoryServices.AccountManagement.AuthenticablePrincipal)(result)).Enabled可以很好地确定用户列表中启用了的真假。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25245940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档