Флаг PASSWD_CANT_CHANGE отсутствует в атрибуте UserAccountControl - PullRequest
0 голосов
/ 28 декабря 2018

Мне нужно проверить через 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 голосов
/ 29 декабря 2018

ОБНОВЛЕНИЕ Появляется из AD 2008 на том, что это не "реальное" значение;а точнее ACE в ACL записи .

ЭТО НЕ БОЛЬШЕ РАБОТАЕТ Насколько я могу судить.В Microsoft Active Directory есть аккуратное расширяемое значение сопоставления, которое должно работать и которое называется LDAP_MATCHING_RULE_BIT_AND

Так что простой фильтр запросов LDAP, такой как:

(userAccountControl:1.2.840.113556.1.4.803:=64)

Должен помочь.

0 голосов
/ 28 декабря 2018

Это, к сожалению, ожидается.

Microsoft использует перечисление ADS_USER_FLAG_ENUM в нескольких местах:

  1. Атрибут userAccountControl при использованииLDAP и
  2. Свойство userFlags при использовании поставщика WinNT.

Флаг ADS_UF_PASSWD_CANT_CHANGE можно использовать только при использовании поставщика WinNT ,что я не уверен, что вы можете сделать из Java.

Когда вы устанавливаете флажок «Пользователь не может изменить пароль» в AD Users and Computers, он фактически не меняет атрибут userAccountControl.В действительности он добавляет два разрешения для учетной записи:

  1. Запретить изменение пароля на «Все»
  2. Запретить изменение пароля на «САМОЕ»

Тамописание того, как искать эти разрешения здесь , но примеры приведены на C ++ и VBScript.Я не знаю, как просмотреть разрешения в Java. Это кажется трудным , и я не могу найти реальных примеров.

...