
Как просмотреть 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.
решение1
Модуль имеет продуманную логику, которая вычисляет «популярные» свойства, например, установлена 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
, а затем выполните побитовую операцию 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которые, например, довольно важны для запросов системного администратора.