Назад | Перейти на главную страницу

Что, черт возьми, происходит с этим фильтром AD в PowerShell?

я недавно написал этот ответ и наткнулся на кое-что интересное.

get-aduser -filter {-not (description -eq "auto")} | measure-object

и

get-aduser -filter {description -ne "auto"} | measure-object

возвращает две очень разные вещи при запуске с одними и теми же данными, причем первая команда возвращает ожидаемое значение. На первый взгляд кажется, что пользователи с нулевым значением в поле описания не возвращается как совпадение во второй команде, хотя NULL явно не равно «auto».

Несколько человек в чате посмотрели на это и подтвердили, что я не сумасшедший. Что тут происходит?

Ключевое различие между ними заключается в том, что первая команда не включает прямого сравнения значений для получения всех результатов, а вторая команда делает. Первая команда включает результаты NULL, а вторая - нет (как уже обнаружил MDMarra). Обе команды начинаются с этого командлета:

get-aduser

Проходя нижеприведенное, помните, что результаты этого командлета включают всех пользователей AD, независимо от чего-либо еще в -filter параметр после него.

Теперь давайте разберем две разные части. Первый:

{-not (description -eq "auto")}

...средства

  1. "выяснить, где находится описание атрибута равно текстовая строка «авто». Чтобы это сравнение работало, должна существовать строка в поле описания для -eq оператор, чтобы иметь возможность сравнить его с "авто". Значения NULL исключаются из этого сравнения, поскольку оно не может сравнивать NULL со строковым значением.
  2. независимо от -eq параметр фильтра дай мне ВСЕ, что НЕ является результатом (description -eq "auto"), который будет включать NULL, поскольку исходный командлет get-aduser, включает всех пользователей AD. Не нужно было ни с чем сравнивать -not оператор. Он просто дал вам все, кроме результатов (description -eq "auto") фильтр были.

В вашем примере предположим, что у вас есть 1 пользователь AD, описание которого равно «auto», несколько сотен с чем-то отличным от «auto» и несколько сотен с описанием NULL. Пройдя через логику команды, он сделает:

  1. Дайте мне всех пользователей AD (get-aduser), где описание равно "auto" - будет 1 пользователь
  2. Дайте мне всех пользователей AD, которые НЕ являются тем, что вы мне только что дали - результат - несколько сотен с чем-то еще И несколько сотен с NULL.

Поскольку не нужно было ничего сравнивать ни с чем другим, используя -not оператор, результат включал NULL описание пользователей, которые были захвачены в исходном get-aduser командлет.

Вторая команда:

{description -ne "auto"}

...средства

  1. "выяснить, где находится описание атрибута не равно точная строка "авто". Опять же, чтобы это сравнение работало, должна существовать строка в поле описания для -ne оператор, чтобы иметь возможность сравнить его с "авто". Значения NULL исключаются из этого сравнения, поскольку оно не может сравнивать NULL со строковым значением.

В вашем примере снова предположим, что у вас есть 1 пользователь AD, описание которого равно «auto», несколько сотен с чем-то отличным от «auto» и несколько сотен с описанием NULL. Пройдя через логику команды, он сделает:

  1. Дайте мне всех пользователей AD, у которых описание не равно "auto" - в результате будут несколько сотен пользователей, в описании которых будет что-то другое, кроме "auto". Он не привлекает пользователей с описанием NULL, потому что он не может сравнить NULL с текстовой строкой.

В любом случае вся разница между двумя командами определенно не интуитивно понятна.

Используя эту команду, вы также сможете перехватывать NULL с "-and", вот так:

{description -ne "auto" -and description -ne $NULL}

Я не на 100% разбираюсь в синтаксисе, так как не могу его проверить прямо сейчас, и, вероятно, есть способ сделать это лучше, чем этот. Когда все это разбито, это довольно антиклиматично, и для объяснения потребовалось много набора текста, но я сталкивался с такими странными вещами, прежде чем использовать различные операторы, и много проб и ошибок, так как я никогда не могу вспомнить все предостережения которые идут вместе с использованием каждого из них.

Ссылка: http://technet.microsoft.com/en-us/library/hh847732.aspx:

Операторы сравнения

Используйте операторы сравнения (-eq, -ne, -gt, -lt, -le, -ge) для сравнения значений и условий тестирования. Например, вы можете сравнить два строковых значения, чтобы определить, равны ли они.

Операторы сравнения включают в себя операторы сопоставления (-match, -notmatch), которые находят шаблоны с помощью регулярных выражений; оператор замены (-replace), который использует регулярные выражения для изменения входных значений; аналогичные операторы (-like, -notlike), которые находят шаблоны с помощью подстановочных знаков (*); и операторы включения (in, -notin, -contains, -notcontains), которые определяют, появляется ли тестовое значение в наборе ссылок.

Они также включают поразрядные операторы (-bAND, -bOR, -bXOR, -bNOT) для управления битовыми шаблонами в значениях.

Для получения дополнительной информации см. About_Comparison_Operators

Логические операторы

Используйте логические операторы (-and, -or, -xor, -not,!) Для объединения условных операторов в одно сложное условное. Например, вы можете использовать логический оператор -and для создания фильтра объектов с двумя разными условиями.

Для получения дополнительной информации см. About_Logical_Operators.

Добавим к этому старому вопросу, который возникает при поиске:

Использование -Filter с отрицательным соответствием, например -ne или -notlike, исключает результаты с пустыми значениями NULL. Чтобы они были включены, вам также необходимо явно сопоставить, используя -не как '*' так как -экв '' и -eq $ NULL не действующие фильтры. Обратите внимание, что это причуда с -Filter, использование прямого -LdapFilter ДЕЙСТВИТЕЛЬНО отрицательно соответствует пустым значениям.

Вот пример множественного совпадения с фильтром и LdapFilter с отрицательным:

Get-ADUser -Filter { mail -like '*example*' -and (description -ne 'example' -or description -notlike '*') }

Get-ADUser -LdapFilter '(&(mail=*example*)(!description=example))'