Назад | Перейти на главную страницу

Найдите заблокированные учетные записи в Active Directory (способ, который действительно работает!)

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

Сохраненный запрос - (&(&(&(objectCategory=Person)(objectClass=User)(lockoutTime>=1))))

Перечисляет ряд учетных записей, многие из которых не заблокированы. Если я разблокирую тот, который, как я знаю, заблокирован, он все равно возвращается запросом.

Команда Powershell - Search-ADAccount -LockedOut

Ничего не делает.

Так что либо - я что-то не так делаю? Или - есть метод, который действительно работает?

Я бы не обязательно доверял Get-ADUser -LDAPFilter "(&(objectCategory=Person)(objectClass=User)(lockoutTime>=1))" -Properties LockedOut, так как он также не возвращает надежных результатов для меня, но я также не могу напрямую связаться с моим PDCe в настоящее время. Для достижения наилучших результатов вы можете напрямую настроить таргетинг на свой эмулятор PDC, поскольку он всегда имеет самую свежую информацию о блокировках учетных записей во всем домене.

Я держу пари, что вы наблюдаете задержку репликации:

... блокировка учетной записи срочно реплицируется на владельца роли эмулятора основного контроллера домена (PDC), а затем срочно реплицируется на следующее:

• Контроллеры домена в том же домене, которые расположены на том же сайте, что и эмулятор PDC.

• Контроллеры домена в том же домене, которые находятся на том же сайте, что и контроллер домена, обработавший блокировку учетной записи.

• Контроллеры домена в том же домене, которые расположены на сайтах, которые были настроены для разрешения уведомлений об изменениях между сайтами (и, следовательно, срочной репликации) с сайтом, содержащим эмулятор PDC, или с сайтом, на котором была обработана блокировка учетной записи. Эти сайты включают любой сайт, который включен в ту же ссылку сайта, что и сайт, содержащий эмулятор PDC, или в ту же ссылку сайта, что и сайт, содержащий контроллер домена, который обработал блокировку учетной записи.

Кроме того, при сбое проверки подлинности на контроллере домена, отличном от эмулятора PDC, проверка подлинности повторяется на эмуляторе PDC. По этой причине эмулятор PDC блокирует учетную запись перед контроллером домена, который обработал неудачную попытку ввода пароля, если достигнут порог попытки ввода неверного пароля. Дополнительные сведения о том, как владелец роли эмулятора PDC управляет изменениями пароля и блокировкой учетных записей, см. В разделе «Управление гибкими операциями с одним главным мастером» в этой книге.

Поэтому постарайтесь Search-ADAccount -LockedOut -Server DC-PDCE и посмотрите, стали ли ваши результаты лучше.

Кроме того, вот еще кое-что, что следует учитывать при построении запросов по атрибуту lockoutTime:

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

Редактировать: Путем реверс-инжиниринга Microsoft.ActiveDirectory.Management.dll, Я могу вам сказать Search-ADAccount -LockedOut, который, как мне кажется, дает довольно надежные результаты, запускает следующий код:

else if ((bool) this._paramSet.LockedOut)
      {
        list.Add(ADAccountFactory<ADAccount>.AttributeTable[cmdletSessionInfo.ConnectedADServerType]["AccountLockoutTime"].InvokeToSearcherConverter(ADOPathUtil.CreateFilterClause(ADOperator.Ge, "AccountLockoutTime", (object) 1), cmdletSessionInfo));
        this.OutputFilterFunction = new ADGetCmdletBase<SearchADAccountParameterSet, ADAccountFactory<ADAccount>, ADAccount>.OutputFilterDelegate(this.FilterIsLockedOut);
      }
      if (list.Count > 0)
        this.OutputSearchResults(list.Count != 1 ? ADOPathUtil.CreateAndClause(list.ToArray()) : list[0]);
      else
        this.OutputSearchResults((IADOPathNode) null);

Получается, что Search-ADAccount -LockedOut тоже смотрит на атрибут AccountLockoutTime!

Отредактируйте еще несколько для большей справедливости: Ричард Мюллер, реж. Сервисы MVP, говорит следующее:

Вы не можете использовать атрибут userAccountControl для идентификации заблокированных пользователей. Для этого задокументировано немного userAccountControl, но он не используется.

Я могу проверить это следующим образом:

PS C:\Users\ryan> $(Search-ADAccount -LockedOut).Count
11
PS C:\Users\ryan> $(Get-ADUser -LDAPFilter "(&(objectCategory=User)(userAccountControl:1.2.840.113556.1.4.803:=16))").Count
0

Наконец, я хотел бы закончить это сообщение в блоге по теме, что объясняет, почему lockoutTime>=1 приближается к лучшему решению, но это только часть истории. Вам необходимо дополнительно отфильтровать список, чтобы включить только тех пользователей, у которых время блокировки больше, чем $ (продолжительность блокировки вашего домена) минут в прошлом.