Как может я, представление LDAP Query, выполняемое, Добирается-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. В Глобальном поиске можно создать запрос при помощи ключевых слов и отмечающий флажки, и, чем нажимают на Convert to LDAP. Наслаждайтесь хорошим и сложным запросом LDAP.
Модуль ActiveDirectory
имеет хитроумную логику, которая вычисляет «популярные» свойства, например, включена ли учетная запись пользователя Включена
или имеет ли 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
Чтобы найти отключенные
учетные записи, мы можем использовать следующий синтаксис фильтра:
(&(userAccountControl:1.2.840.113556.1.4.803:=2))
Как всегда, вы можете инвертировать выражение ldap с помощью ! [1 147604], в этом примере получение всех
Включенных
учетных записей:
(!(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
, а затем выполнить побитовую маску И для результатов на стороне клиента.
Если вы действительно хотите знать, какие именно запросы 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 он использует.
Я думаю, вам больше всего повезет, потратив некоторое время на изучение схемы AD и самостоятельное построение запросов, а не на попытки перепроектировать собственные инструменты Microsoft. AD - это достаточно простой каталог LDAP, поэтому справочные статьи, в которых говорится о LDAP в целом, будут применимы. Там есть некоторые странности, такие как битовые поля в атрибутах, унаследованных от Windows NT 4.0 , которые, например, довольно важны для запросов системного администратора.