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

Запрос LDAP за командлетом Get-ADUser

Как просмотреть LDAP-запрос, выполняемый Get-ADUser за кулисами, т.е. эта команда

Get-ADUser -Filter * -Properties * | Where { $_.Enabled -eq $True } | Where { $_.PasswordNeverExpires -eq $False } | Where { $_.PasswordExpired -eq $False }

Я хотел бы знать точный запрос LDAP, отправленный на серверы Active Directory.

Изменить: я пытаюсь преобразовать некоторые сценарии Powershell в Python, поэтому мне нужен необработанный запрос LDAP, который я могу передать на python-ldap.

Edit2: Центр администрирования Active Directory имеет хорошую функцию для изучения запросов LDAP. В глобальном поиске вы можете создать запрос, используя ключевые слова и установив флажки, а затем щелкнув Преобразовать в LDAP. Наслаждайтесь красивым и сложным запросом LDAP.

Если вы действительно хотите знать, какие именно запросы LDAP выполняются командлетами Powershell, вы можете декомпилировать их с помощью DotPeek, используя метод, который я описываю здесь:

https://www.myotherpcisacloud.com/post/2013/07/08/Taking-a-Peek-Inside-Powershell-Cmdlets.aspx

Использовать $(Get-Command Get-ADUser).DLL чтобы узнать, из какой DLL импортируется командлет. Затем используйте Trace-Command чтобы увидеть имя метода в DLL, который вызывается Get-ADUser.

Trace-Command -Name CommandDiscovery -Expression { Get-ADUser bob } -PSHost

Теперь используйте JetBrains DotPeek для декомпиляции этой библиотеки DLL и посмотрите код самостоятельно.


В качестве альтернативы, вместо того, чтобы проходить через весь этот беспорядок, почему бы вам просто не сделать это:

Get-ADUser -LDAPFilter "(objectCategory=person)"

И теперь вы знаете (и можете контролировать), какой именно запрос LDAP он использует.

В ActiveDirectory модуль имеет умную логику, которая вычисляет "популярные" свойства, например, является ли учетная запись пользователя Enabled или есть PasswordNeverExpires установить и представить их как обычные атрибуты.

Внутренне они получены из фактических атрибутов учетной записи, таких как userAccountControl и pwdLastSet.

Настройки учетной записи

userAccountControl является битовым полем и содержит длинный список настроек, связанных с безопасностью учетной записи, таких как «Пользователь не может изменить пароль» и учетная запись «Отключена».

Реализация LDAP от Microsoft позволяет фильтровать такой атрибут с помощью побитовых операторов, идентифицируемых идентификатором объекта (OID):

  • LDAP_MATCHING_RULE_BIT_AND: 1.2.840.113556.1.4.803
  • LDAP_MATCHING_RULE_BIT_OR : 1.2.840.113556.1.4.804

Найти Disabled учетных записей, мы можем использовать следующий синтаксис фильтра:

(&(userAccountControl:1.2.840.113556.1.4.803:=2))

Как всегда, вы можете отрицать выражение ldap с помощью !, в этом примере получение всех Enabled Счета:

(!(userAccountControl:1.2.840.113556.1.4.803:=2))

Аналогично, настройка называется DONT_EXPIRE_PASSWORD имеет значение 65536 (0x10000), и мы можем найти эти учетные записи с помощью:

(&(userAccountControl:1.2.840.113556.1.4.803:=65536))

Срок действия пароля

Расчет срока действия пароля немного сложнее. Чтобы помочь разработчикам и интеграторам, Microsoft реализовала динамический атрибут с именем msDS-User-Account-Control-Computed.

msDS-User-Account-Control-Computed прозрачно возвращает то же значение, что и userAccountControl, но с добавлением следующих битов, вычисляемых на лету во время поиска:

UF_LOCKOUT                     0x0010
UF_PASSWORD_EXPIRED          0x800000
UF_PARTIAL_SECRETS_ACCOUNT  0x4000000
UF_USE_AES_KEYS             0x8000000

Я не тестировал это, но если мне не изменяет память, это должно вам помочь надежно определять учетные записи с просроченными паролями с помощью этого фильтра:

(&(msDS-User-Account-Control-Computed:1.2.840.113556.1.4.803:=8388608))

К сожалению, вы не можете использовать сконструированные атрибуты в фильтрах запросов LDAP, поэтому вам нужно будет выполнить фильтрацию по первым двум операторам:

(&(!userAccountControl:1.2.840.113556.1.4.803:=2)(!userAccountControl:1.2.840.113556.1.4.803:=65536))

Не забудьте запросить у сервера каталогов msDS-User-Account-Control-Computed значение, а затем выполните побитовую маску И для результатов на стороне клиента.

Я думаю, вам будет удачно потратить некоторое время на изучение Схема AD и самостоятельно создавать запросы, а не пытаться перепроектировать собственные инструменты Microsoft. AD - это достаточно простой каталог LDAP, поэтому справочные статьи, в которых говорится о LDAP, будут применимы. Там являются некоторые странности вроде битовые поля в атрибуты, унаследованные от Windows NT 4.0 которые довольно важны, например, для запросов системного администратора.