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 标志的主要内容,如果未能解决你的问题,请参考以下文章