Как мы знаем, многие атрибуты объектов Active Directory представлены в виде битовых масок. Например, такие как UserAccountControl для объектов пользователя или компьютера или GroupType для объекта группы.
И хотя командлеты модуля ActiveDirectory представляют эти значения в виде отдельных атрибутов, скрывая от пользователя их истинную природу, иногда нам все-таки приходится работать с ними напрямую.
Давайте для простоты возьмем второй флаг атрибута UserAccountControl — ADS_UF_ACCOUNTDISABLE. Установка этого флага в 1 означает, что объект — пользователя или компьютера — отключен (Disabled), если же значение этого флага равно нулю — объект активен (Enabled).
Тут стоит сказать, что при использовании командлетов модуля ActiveDirectory нам доступно свойство Enabled, которое отражает значение этого флага, и которое вы скорее всего и будете использовать в обычных обстоятельствах. Но одним флагом ADS_UF_ACCOUNTDISABLE все дело не ограничивается, и подходы, рассматриваемые в данной статье вы сможете применить как при работе с другими флагами, так и при запросе значения этого же флага посредством ADSI — Active Directory Service Interfaces.
Для того, чтобы проверить, активен ли объект пользователя при помощи командлета Get-ADUser и параметра -Filter, нам потребуется воспользоваться оператором -band, то есть побитовым И:
$user = Get-ADUser -Identity someuser -Properties UserAccountControl $user.UserAccountControl -band 2
В этом случае, если в качестве результата будет возвращен ноль, то учетная запись пользователя someuser активна — то есть второй флаг, позиционное значение которого равно двум, не установлен.
Если же результатом будет то самое значение 2 — это означает, что флаг установлен и аккаунт деактивирован.
В том случае, если мы хотим вывести объекты только активных пользователей, нам потребуется следующая команда:
Get-ADUser -Filter {-not (userAccountControl -band 2)}
Понятно, что при этом вы можете воспользоваться и дополнительными условиями фильтрации, чтобы еще больше сократить объем выводимой информации.
Если же мы решили воспользоваться параметром -LDAPFilter, то в этом случае синтаксис будет несколько другим:
Get-ADUser -LDAPFilter '(!userAccountControl:1.2.840.113556.1.4.803:=2)'
Как мы видим, в этом случае символ ! используется вместо оператора -not, а строка :1.2.840.113556.1.4.803:= — вместо -band.
1.2.840.113556.1.4.803 — это Object ID правила LDAP_MATCHING_RULE_BIT_AND, то есть того же самого побитового И.
Именно он нам потребуется при выполнении запросов через ADSI.
$ADSISearcher = [adsisearcher]'(&(objectCategory=person)(!userAccountControl:1.2.840.113556.1.4.803:=2))' $ADSISearcher.FindAll()
Что же касается оператора -bor, то Object ID эквивалентного ему правила — 1.2.840.113556.1.4.804 — LDAP_MATCHING_RULE_BIT_OR и вы точно так же можете использовать его в разного рода запросах.
Страницы в социальных сетях:
Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell