PASSWD_CANT_CHANGE标志在UserAccountControl属性中不存在

时间:2018-12-28 08:52:38

标签: java active-directory ldap windows-server-2003 unboundid-ldap-sdk

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

我正在使用Java和UnboundID LDAP SDK(https://ldap.com/unboundid-ldap-sdk-for-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属性以外的其他解决方案都可以!

谢谢!

2 个答案:

答案 0 :(得分:1)

不幸的是,这是预期的。

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

  1. 使用LDAP时的userAccountControl属性,和
  2. 使用WinNT提供程序时的userFlags属性。

ADS_UF_PASSWD_CANT_CHANGE标志只能用于when using the WinNT provider,我不确定您可以从Java中使用。

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

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

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

答案 1 :(得分:0)

更新 从AD 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)

应该做到这一点。