Запрос LDAP позади Получает-ADUser commandlet

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

ADAC GUI

3
задан 25 November 2014 в 00:33
3 ответа

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

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

Account Settings

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

6
ответ дан 3 December 2019 в 04:39

Если вы действительно хотите знать, какие именно запросы 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 он использует.

7
ответ дан 3 December 2019 в 04:39

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

4
ответ дан 3 December 2019 в 04:39

Теги

Похожие вопросы