я недавно написал этот ответ и наткнулся на кое-что интересное.
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")}
...средства
-eq
оператор, чтобы иметь возможность сравнить его с "авто". Значения NULL исключаются из этого сравнения, поскольку оно не может сравнивать NULL со строковым значением.-eq
параметр фильтра дай мне ВСЕ, что НЕ является результатом (description -eq "auto")
, который будет включать NULL, поскольку исходный командлет get-aduser
, включает всех пользователей AD. Не нужно было ни с чем сравнивать -not
оператор. Он просто дал вам все, кроме результатов (description -eq "auto")
фильтр были.В вашем примере предположим, что у вас есть 1 пользователь AD, описание которого равно «auto», несколько сотен с чем-то отличным от «auto» и несколько сотен с описанием NULL. Пройдя через логику команды, он сделает:
Поскольку не нужно было ничего сравнивать ни с чем другим, используя -not
оператор, результат включал NULL описание пользователей, которые были захвачены в исходном get-aduser
командлет.
Вторая команда:
{description -ne "auto"}
...средства
-ne
оператор, чтобы иметь возможность сравнить его с "авто". Значения NULL исключаются из этого сравнения, поскольку оно не может сравнивать NULL со строковым значением.В вашем примере снова предположим, что у вас есть 1 пользователь AD, описание которого равно «auto», несколько сотен с чем-то отличным от «auto» и несколько сотен с описанием 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))'