Как просмотреть 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 которые довольно важны, например, для запросов системного администратора.