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

8

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

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

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

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

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

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

MrVimes
источник
Небольшое примечание: чтобы управлять доменом с помощью команд, включенных в модуль AD PowerShell (включая использование командлета Search-ADAccount), у вас должна быть установлена ​​служба веб-служб Active Directory (ADWS) хотя бы на одном контроллере домена в этом домене. Но я думаю, что это не проблема, потому что, если у вас нет экземпляра ADWS, вы получите сообщение об ошибке, уведомляющее вас об этом.
Михаил

Ответы:

11

Я не обязательно буду доверять 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:

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

Изменить: с помощью обратного инжиниринга 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приближается лучшее решение, но это только часть истории. Вам необходимо дополнительно отфильтровать список, чтобы включить только тех пользователей, у которых их время блокировки больше $ (длительности блокировки вашего домена) в прошлом.

Райан Райс
источник
Мне будет интересно найти документацию о том, когда этот userAccountControlбит перестал быть действительным. В прошлом все работало нормально, если память не изменяет. Это заставляет меня задуматься, была ли удалена эта функциональность в более поздней версии кода AD. Хм ...
Эван Андерсон
Ну, я ненавижу продолжать апеллировать к авторитету, но Ричард Мюллер говорит, что это не работает с Windows 2000.
Райан Райс
Я подозреваю, что он работает в Windows 2000, когда присутствуют контроллеры домена Windows NT 4.0, потому что он должен быть там, чтобы облегчить репликацию на контроллеры домена, которые имеют SAM. У меня больше нет тестовой среды для NT 4.0 (я удалил все эти старые виртуальные машины), но я определенно собираюсь попробовать ее. Там будет иметь , чтобы быть способом для SAM-только контроллеры домена , чтобы иметь возможность быть в курсе счета lockout-- , что это единственный способ , что я могу видеть это работает.
Эван Андерсон
@EvenAnderson Я искренне поддерживаю ваши исследования и с энтузиазмом жду ваших результатов испытаний. :)
Райан Райс