Фильтровать пользователя по статусу нескольких UAC - PullRequest
0 голосов
/ 25 октября 2019

Мне нужно отфильтровать пользователей моего активного каталога на основе их статуса UAC. Я хочу добиться этого путем поиска предопределенного массива значений в массиве. Я продолжаю получать ошибки от powershell, независимо от того, как я получаю свои скобки (обычные или обычные).

это мой сценарий. Вы можете сказать, что я делаю не так?

$uac = "512", "544", "66048", "66080"

Get-ADUser -Properties *  -SearchBase "DC=domain,DC=com" -Filter $uac.IndexOf(userAccountControl) -gt 0 | Select * |OUT-GRIDVIEW

Мне нужно убедиться, что я могу фильтровать результаты по diffrenet в будущем

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Get-ADUser -Filter не поддерживает запуск произвольного кода (например, IndexOf()) для каждого объекта каталога. Но если вы хотите выполнить запрос в стиле -in к Active Directory, тогда LDAP, который Get-ADUser использует «закулисную» для своего фильтра запросов, имеет оператор OR (|), который вы можете использоватьописать несколько условий одновременно.

В вашем случае результирующий фильтр запросов должен выглядеть примерно так:

(|(userAccountControl=512)(userAccountControl=544)(userAccountControl=66048)(userAccountControl=66080))

Если у вас есть много отдельных значений, которые вы ищете, или вы можете изменить их вВ будущем я бы предложил создать динамический фильтр запросов LDAP с помощью цикла и оператора строкового формата -f:

# exact values we're looking for any of
$uac = "512", "544", "66048", "66080"

# template strings for the LDAP query filter
$LDAPORTemplate = '(|{0})'
$UACEqualsTemplate = '(useraccountcontrol={0})'

# generate the individual filter clause for each possible UAC value
$clauses = foreach($value in $uac){
    $UACEqualsTemplate -f $value
}

# join in a single string
$clauses = $clauses -join ''

# wrap in OR operator
$LDAPQuery = $LDAPORTemplate -f $clauses

Get-ADUser -LDAPFilter $LDAPQUery -Properties * -SearchBase "DC=domain,DC=com" |Select * |Out-GridView
1 голос
/ 25 октября 2019

Ответ на ваш ближайший вопрос заключается в том, что вы что-то упустили после -gt. Вы, вероятно, хотите -1 там? (но, как указывает Маттиас, даже это не сработает).

Но есть лучший способ сделать это. Похоже, вы пытаетесь найти только включенные учетные записи.

Короткий ответ: чтобы избежать необходимости добавлять все больше и больше номеров в ваш список, вы хотите сделать следующее:

Get-ADUser -Properties * -SearchBase "DC=domain,DC=com" -LDAPFilter "(!userAccountControl:1.2.840.113556.1.4.803:=2)"

Длинный ответ

Атрибут userAccountControl является битовым флагом. Битовые флаги - это числа, где каждая цифра в двоичном числе является флагом, который что-то значит. Отключенный флаг - это вторая цифра (справа). Например, 514 это в двоичном виде:

10 0000 00 1 0

Этот жирный шрифт 1 означает «это отключено». Но любая из этих других цифр может быть 1, и она все равно будет отключена, даже если десятичное представление отличается.

Но 512 не отключено, потому что этот бит не установлен:

10 0000 00 0 0

Единственный гарантированный способ определить, установлен этот бит или нет, это использовать побитовую операцию.

Чтобы сделать это с Active Directory, вы должны использовать этот фильтр LDAP:

(!userAccountControl:1.2.840.113556.1.4.803:=2)

Этот странный номер является правилом соответствия, называемым LDAP_MATCHING_RULE_BIT_AND . Мы используем 2, потому что это 10 в двоичном формате (второй бит). Поскольку наш запрос имеет ! перед, это означает: «если второй бит не установлен».

...