UserAccountControl 属性中不存在 PASSWD_CANT_CHANGE 标志

Posted

技术标签:

【中文标题】UserAccountControl 属性中不存在 PASSWD_CANT_CHANGE 标志【英文标题】:PASSWD_CANT_CHANGE flag not present in UserAccountControl attribute 【发布时间】:2019-05-26 02:53:53 【问题描述】:

如果 ActiveDirectory 用户设置了 PASSWD_CANT_CHANGE 标志,我需要通过 LDAP 检查。我找到了 UserAccountControl 属性 (https://docs.microsoft.com/it-it/windows/desktop/ADSchema/a-useraccountcontrol):它适用于所有其他标志,但不适用于此标志。我只需要读它,不需要写。

我正在使用带有 UnboundID LDAP SDK (https://ldap.com/unboundid-ldap-sdk-for-java/) 的 Java。

这是我的 JUnit 测试代码。

public static enum UACFlags 
    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);

    private int flag;

    private UACFlags(int flag) 
        this.flag = flag;
    


@Test
public void testLDAP() throws LDAPException 
    LDAPConnection connection = //GET CONNECTION

    String username = "....";
    String search = "(sAMAccountName=" + username + ")";

    SearchRequest request = new SearchRequest("DC=....,DC=....", SearchScope.SUB, search, SearchRequest.ALL_USER_ATTRIBUTES);
    SearchResult result = connection.search(request);
    SearchResultEntry entry = result.getSearchEntries().get(0);

    Attribute a = entry.getAttribute("userAccountControl");
    int val = a.getValueAsInteger();
    System.out.println(Integer.toHexString(val));

    EnumSet<UACFlags> flags = EnumSet.noneOf(UACFlags.class);
    for (UACFlags f : UACFlags.values()) 
        if ((val & f.flag) == f.flag) 
            flags.add(f);
        
    
    System.out.println("FLAGS: " + flags);

我在 AD 用户和计算机上设置了标志,它按预期工作。我只想使用 Java 和 LDAP 以编程方式检查标志。 UserAccountControl 属性以外的其他解决方案都可以!

谢谢!!

【问题讨论】:

【参考方案1】:

不幸的是,这是意料之中的。

Microsoft 在几个地方使用ADS_USER_FLAG_ENUM 枚举:

    使用 LDAP 时的 userAccountControl 属性,并且 使用 WinNT 提供程序时的 userFlags 属性。

ADS_UF_PASSWD_CANT_CHANGE 标志只能用于 when using the WinNT provider,我不确定你是否可以从 Java 中做到这一点。

当您单击 AD 用户和计算机中的“用户无法更改密码”复选框时,它实际上并没有更改 userAccountControl 属性。实际上,它为帐户添加了两个权限:

    拒绝将密码更改为“所有人” 拒绝将密码更改为“SELF”

有关于如何查找这些权限here 的描述,但示例是用 C++ 和 VBScript 编写的。我不知道如何在 Java 中查看权限。 It seems difficult 我找不到任何真实的例子。

【讨论】:

【参考方案2】:

更新 从公元 2008 年开始,这不是一个“真正的”价值;而是ACE within the ACL of the entry。

这不再有效 据我所知。 Microsoft Active Directory 有一个整洁的可扩展匹配值,它应该可以工作,称为 LDAP_MATCHING_RULE_BIT_AND

所以一个简单的 LDAP 查询过滤器像:

(userAccountControl:1.2.840.113556.1.4.803:=64)

应该做的伎俩。

【讨论】:

我尝试使用指定的过滤器运行查询,但服务器以空集响应... 您确定有设置了标志的帐户吗?试试 (!(userAccountControl:1.2.840.113556.1.4.803:=64))

以上是关于UserAccountControl 属性中不存在 PASSWD_CANT_CHANGE 标志的主要内容,如果未能解决你的问题,请参考以下文章

如何解决“从不”类型中不存在属性

Powershell中不存在特定对象属性时如何删除条目?

C# WPF 附加属性 - 错误:“XML 命名空间中不存在该属性”

“EventTarget”类型中不存在属性“值”

“对象”类型中不存在属性“位置”

Symfony 3 Doctrine 2中不存在属性