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

Запрос 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 Administrative Center имеет отличную функцию для изучения запросов LDAP. В глобальном поиске вы можете создать запрос, используя ключевые слова и отмечая флажки, а затем нажать наПреобразовать в LDAP. Наслаждайтесь приятными и сложными запросами LDAP.

Графический интерфейс пользователя ADAC

решение1

Модуль имеет продуманную логику, которая вычисляет «популярные» свойства, например, установлена ActiveDirectory​​ли учетная запись пользователя, и представляет их как обычные атрибуты.EnabledPasswordNeverExpires

Внутренне они выводятся из фактических атрибутов учетной записи, таких как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, а затем выполните побитовую операцию AND над результатами на стороне клиента.

решение2

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

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

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

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

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


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

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

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

решение3

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

Связанный контент