Подтвердить что ты не робот

Обнаружение, если учетная запись пользователя Active Directory заблокирована с использованием LDAP в Python

Я проверяю логины пользователей, используя модуль python ldap. Когда вход завершается с ошибкой, я получаю логин ldap.INVALID_CREDENTIALS, но это может быть либо из-за неправильного пароля, либо из-за блокировки учетной записи. Учетная запись заблокирована после третьей попытки.

Я хотел бы обнаружить, что учетная запись заблокирована и сообщит об этом разочарованному пользователю вместо того же сообщения "неверный вход".

Поиск найденного решения:

  • Флаг UserAccountControl LOCKED не используется AD;
  • Вместо этого следует использовать атрибут lockoutTime

В качестве LDAP-запроса, который я должен использовать, чтобы найти заблокированных пользователей:

(&(objectClass=user)(lockoutTime>=1))

Или для конкретного пользователя:

(&(objectClass=user)(sAMAccountName=jabberwocky)(lockoutTime>=1))

Но это не работает, запрос не возвращает результатов каждый раз.

4b9b3361

Ответ 1

Значение нуля в lockoutTime означает, что оно не заблокировано. Итак, вы должны попробовать это.

(&(objectClass=user)(!lockoutTime=0)) 

Собственно, вышеуказанный запрос по-прежнему не соответствует 100%. Если вы прочитали мелкий шрифт из MSDN, Microsoft предложит вам добавить атрибут Lockout-Time к атрибуту Lockout-Duration, а затем сравнить его с текущим временем. Это потому, что есть такая вещь, которая называется продолжительностью локаута. Как только длительность блокировки проходит, пользователь разблокируется автоматически. Zero in Lockout-Duration означает, что учетная запись заблокирована навсегда, пока администратор не разблокирует ее.

См. статью MSDN

Это значение атрибута только reset, когда учетная запись зарегистрирована на успешно. Это означает, что это значение может быть не равным нулю, но учетная запись не заблокирована. Чтобы точно определить, является ли учетная запись заблокирован, вы должны добавить Lockout-Duration к этому времени и сравнить результат до текущего времени, учитывающий локальные часовые пояса и летнее время.

Ответ 2

lockoutTime является атрибутом <not set>, поэтому самый простой способ - использовать:

(&(objectClass=user)(lockoutDuration=*))) 

для непустых записей.

Update:

Однако это значение также устанавливается, когда пароль истекает, пароль должен измениться и т.д.

Поэтому его необходимо отфильтровать по:

UserPrincipal userPrincipal = new UserPrincipal(context);
bool isLocked = userPrincipal.IsAccountLockedOut();

чтобы получить случаи, когда пользователь заблокирован, потому что они нарушили политику паролей, например, неверно ввели пароль 5 раз.

Ответ 3

Кроме того, я обнаружил, что lockoutTime не гарантируется для всех пользователей в AD (по крайней мере, в нашей конфигурации), но будет создан после достижения количества неудачных попыток блокировки. Поэтому при проверке заблокированных учетных записей потребуется также проверка на отсутствие или эквивалент.

Ответ 4

используйте этот запрос, чтобы получить наилучшие результаты,

Get-ADUser -LDAPFilter "(objectcategory = Person) (objectclass= Пользователь) (lockoutTime >= 1))" -Properties LockedOut

Ответ 5

Я также нашел этот список флагов свойств: Как использовать флаги UserAccountControl

SCRIPT  0x0001  1
ACCOUNTDISABLE  0x0002  2
HOMEDIR_REQUIRED    0x0008  8
LOCKOUT 0x0010  16
PASSWD_NOTREQD  0x0020  32
PASSWD_CANT_CHANGE 0x0040   64
ENCRYPTED_TEXT_PWD_ALLOWED  0x0080  128
TEMP_DUPLICATE_ACCOUNT  0x0100  256
NORMAL_ACCOUNT  0x0200  512
INTERDOMAIN_TRUST_ACCOUNT   0x0800  2048
WORKSTATION_TRUST_ACCOUNT   0x1000  4096
SERVER_TRUST_ACCOUNT    0x2000  8192
DONT_EXPIRE_PASSWORD    0x10000 65536
MNS_LOGON_ACCOUNT   0x20000 131072
SMARTCARD_REQUIRED  0x40000 262144
TRUSTED_FOR_DELEGATION  0x80000 524288
NOT_DELEGATED   0x100000    1048576
USE_DES_KEY_ONLY    0x200000    2097152
DONT_REQ_PREAUTH    0x400000    4194304
PASSWORD_EXPIRED    0x800000    8388608
TRUSTED_TO_AUTH_FOR_DELEGATION  0x1000000   16777216
PARTIAL_SECRETS_ACCOUNT 0x04000000      67108864

Вы должны сделать двоичный-И свойства userAccountControl с 0x002. Чтобы получить все заблокированные (т.е. Отключенные) учетные записи, вы можете использовать

(&(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2))

Для оператора 1.2.840.113556.1.4.803 см. Правила соответствия LDAP

Ответ 6

(& (объектный = пользователь) (&! (LockoutTime = *) ((lockoutTime = 0))))

Вернет объекты, являющиеся пользователями, и будет иметь текущий атрибут с именем lockoutTime, который не равен 0.