如何确定用户帐户是启用还是禁用

Posted

技术标签:

【中文标题】如何确定用户帐户是启用还是禁用【英文标题】:How to determine if user account is enabled or disabled 【发布时间】:2011-01-01 14:45:57 【问题描述】:

我正在拼凑一个快速的 C# win forms 应用程序来帮助解决重复性文书工作。

我已在 AD 中搜索所有用户帐户,并将它们添加到带有复选框的列表视图中。

我想默认 listviewitems 的默认检查状态取决于帐户的启用/禁用状态。

string path = "LDAP://dc=example,dc=local";
DirectoryEntry directoryRoot = new DirectoryEntry(path);
DirectorySearcher searcher = new DirectorySearcher(directoryRoot,
    "(&(objectClass=User)(objectCategory=Person))");
SearchResultCollection results = searcher.FindAll();
foreach (SearchResult result in results)

    DirectoryEntry de = result.GetDirectoryEntry();
    ListViewItem lvi = new ListViewItem(
        (string)de.Properties["SAMAccountName"][0]);
    // lvi.Checked = (bool) de.Properties["AccountEnabled"]
    lvwUsers.Items.Add(lvi);

我正在努力寻找正确的属性来解析以从 DirectoryEntry 对象中获取帐户的状态。我搜索了AD User attributes,但没有找到任何有用的东西。

谁能指点一下?

【问题讨论】:

【参考方案1】:

这里的代码应该可以工作......

private bool IsActive(DirectoryEntry de)

  if (de.NativeGuid == null) return false;

  int flags = (int)de.Properties["userAccountControl"].Value;

  return !Convert.ToBoolean(flags & 0x0002);

【讨论】:

该死,你的速度更快,但这里有一个关于所有标志含义的链接:msdn.microsoft.com/en-us/library/ms680832.aspx 也许这个链接可以补充 Oliver 的 Flags 如果 flags 为零,那么这将返回不正确的 true - 只是处理这种情况的说明。 convert.toboolean 的可读性不是很好。更好地使用 return (flags & 2) = 0 我确实返回了标志 | 0x0002 == 标志。如果返回 true,则设置 disabled 标志。【参考方案2】:

使用 System.DirectoryServices.AccountManagement: domainName 和 username 必须是 domain 和 username 的字符串值。

using (var domainContext = new PrincipalContext(ContextType.Domain, domainName))

    using (var foundUser = UserPrincipal.FindByIdentity(domainContext, IdentityType.SamAccountName, username)) 
    
        if (foundUser.Enabled.HasValue) 
        
            return (bool)foundUser.Enabled;
        
        else
        
            return true; //or false depending what result you want in the case of Enabled being NULL
        
    

【讨论】:

((UserPrincipal)foundUser).Enabled == true 对我有用【参考方案3】:

没有人问,但这是一个 java 版本(因为我最终在这里寻找一个)。空值检查留给读者作为练习。

private Boolean isActive(SearchResult searchResult) 
    Attribute userAccountControlAttr = searchResult.getAttributes().get("UserAccountControl");
    Integer userAccountControlInt = new Integer((String) userAccoutControlAttr.get());
    Boolean disabled = BooleanUtils.toBooleanObject(userAccountControlInt & 0x0002);
    return !disabled;

【讨论】:

赞成花时间分享,因为标题不是特定语言的,这可能真的对某人有帮助。【参考方案4】:

你可以这样使用:

    ADUserAccountControl flags;
    Enum.TryParse(de.Properties["userAccountControl"].Value.ToString(), out flags);

    if(flags.HasFlag(ADUserAccountControl.ACCOUNTDISABLE)
    
        // account is disabled
    

这是所有可能标志的完整列表:

    /// <summary>
    /// Source: https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/useraccountcontrol-manipulate-account-properties
    /// </summary>
    public enum ADUserAccountControl : long
    
        SCRIPT = 0x0001,
        ACCOUNTDISABLE = 0x0002,
        HOMEDIR_REQUIRED = 0x0008,
        LOCKOUT = 0x0010,
        PASSWD_NOTREQD = 0x0020,
        PASSWD_CANT_CHANGE = 0x0040,
        ENCRYPTED_TEXT_PWD_ALLOWED = 0x0080,
        TEMP_DUPLICATE_ACCOUNT = 0x0100,
        NORMAL_ACCOUNT = 0x0200,
        INTERDOMAIN_TRUST_ACCOUNT = 0x0800,
        WORKSTATION_TRUST_ACCOUNT = 0x1000,
        SERVER_TRUST_ACCOUNT = 0x2000,
        DONT_EXPIRE_PASSWORD = 0x10000,
        MNS_LOGON_ACCOUNT = 0x20000,
        SMARTCARD_REQUIRED = 0x40000,
        TRUSTED_FOR_DELEGATION = 0x80000,
        NOT_DELEGATED = 0x100000,
        USE_DES_KEY_ONLY = 0x200000,
        DONT_REQ_PREAUTH = 0x400000,
        PASSWORD_EXPIRED = 0x800000,
        TRUSTED_TO_AUTH_FOR_DELEGATION = 0x1000000,
        PARTIAL_SECRETS_ACCOUNT = 0x04000000,
    

【讨论】:

【参考方案5】:

我来这里是为了寻找答案,但这只是为了DirectoryEntry。所以这是一个适用于SearchResult / SearchResultCollection 的代码,适用于遇到同样问题的人:

private bool checkIfActive(SearchResult sr)

    var vaPropertiy = sr.Properties["userAccountControl"];

    if (vaPropertiy.Count > 0) 
    
        if (vaPropertiy[0].ToString() == "512" || vaPropertiy[0].ToString() == "66048") 
        
            return true;
         
        
        return false;
    

    return false;

【讨论】:

不适用于所有情况。可以同时设置更多的标志。你必须检查标志使用“HasFlag(..)” 作为信息,SearchResult 有一个 GetDirectoryEntry() 方法。

以上是关于如何确定用户帐户是启用还是禁用的主要内容,如果未能解决你的问题,请参考以下文章

如何立即禁用对软删除或不再启用的用户的访问?

从非管理员用户帐户禁用/启用USB设备[关闭]

如何检查“显示通知”是启用还是禁用?

Firebase:在验证时禁用帐户或在启用后发送验证

怎么禁止guest 来宾帐户?

win8 如何设置单独一个用户的权限