我需要通过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属性以外的其他解决方案都可以!
谢谢!
答案 0 :(得分:1)
不幸的是,这是预期的。
Microsoft在几个地方使用了ADS_USER_FLAG_ENUM
枚举:
userAccountControl
属性,和userFlags
属性。 ADS_UF_PASSWD_CANT_CHANGE
标志只能用于when using the WinNT provider,我不确定您可以从Java中使用。
当您单击“ AD用户和计算机”中的“用户无法更改密码”复选框时,它实际上并未更改userAccountControl
属性。实际上,它在帐户上添加了两个权限:
这里描述了如何寻找这些权限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)
应该做到这一点。