Переменные Powershell в Get-AdUser

Я пытаюсь написать простой сценарий PowerShell.

Get-ADuser -Filter {GivenName -eq $GivenName $hateList} -SearchBase $Container -Properties displayName,telephoneNumber,department|ForEach-Object {"FullName`t: $($_.displayName)`r`nPhone`t`t: $($_.telephoneNumber)`r`nDepartment`t: $($_.department)`r`n"}

Ошибка, которую я получил: Get-ADUser: Ошибка синтаксического анализа запроса: 'GivenName -eq $ GivenName $ hateList' Сообщение об ошибке: 'синтаксическая ошибка' в позиции: '26'.

Итак, проблема в том, что переменные не заменяются их значениями. Что я делаю не так?


person adam_gav    schedule 13.03.2012    source источник


Ответы (2)


Неправильный параметр фильтра. Если вы хотите, чтобы GivenName был равен $ GivenName, вы должны сделать это следующим образом:

{GivenName -eq $GivenName}

Если вы хотите, чтобы он был равен $ GivenName или $ hateList, что бы это ни было, вы должны попробовать что-то вроде:

{(GivenName -eq $GivenName) -or (GivenName -eq $hateList)}

Проверьте эту ссылку для получения дополнительных фильтров: http://technet.microsoft.com/en-us/library/ee617241.aspx

Вы можете сначала получить список пользователей с таким фильтром:

{GivenName -eq $GivenName}

И сделаем некоторую постобработку:

$users | Where-Object { $hateList -notcontains  $_.cn }
person Andrey Marchuk    schedule 13.03.2012
comment
@adam_gav Если вас устраивает ответ, примите его. Рядом есть флажок принять - person Andrey Marchuk; 13.03.2012
comment
Спасибо за быстрый ответ! Я хотел бы проверить, что GivenName совпадает с переменной, а hateList содержит строку примерно так: -and cn -ne foo -and cn -ne bar -and cn -ne blabla. не равно парочке струн. Как мне поставить скобки? Я попытался изменить список ненависти следующим образом: -and (cn -ne foo) -and (cn -ne bar) -and (cn -ne blabla) Как я могу сделать фильтр? Я пробовал следующее, но это, конечно, не сработало: -Filter {(GivenName -eq $ GivenName) $ hateList} - person adam_gav; 13.03.2012
comment
Правильно, если вам нужно убедиться, что GivenName не входит в список $ hateList, вам нужно разбить его на несколько условий. Я не думаю, что -contains здесь работает. - person Shay Levy; 13.03.2012
comment
На самом деле ваше предложение было синтаксически неверным, но большая проблема заключается в следующем. Я пробовал это с этим: {(GivenName -eq $ GivenName) -and ($ hateList -notcontains (cn))} Но он выдает ошибку: Сообщение об ошибке: «Действует или не поддерживается: -notcontains» в позиции: «46» . Что не так уж и странно, потому что notcontains отсутствует в документации фильтра. - person adam_gav; 13.03.2012
comment
@adam_gav Тогда вам следует просто придерживаться GivenName в Get-ADuser. Он предоставит вам список пользователей, который затем можно будет отфильтровать по $ hateList. Смотрите мой последний ответ - person Andrey Marchuk; 13.03.2012
comment
Я бы хотел избежать фильтрации объектов, потому что AFAIK значительно медленнее, чем при использовании фильтрации AD. Тем не менее, спасибо за вашу помощь - person adam_gav; 13.03.2012

Если расширение переменной не работает при передаче переменной, попробуйте передать ее в кавычках:

{GivenName -eq "$GivenName"}
person Shay Levy    schedule 13.03.2012
comment
Работает, но главная проблема - hateList. Если я понимаю, мне нужно сделать следующее: -Filter {(GivenName -eq blabla) -and (cn -ne alma) -and (cn -ne korte) -and (cn -ne bela)} В моем контексте это: (GivenName -eq "$GivenName) $ hateList производит следующее: (GivenName -eq blabla) -and (cn -ne alma) -and (cn -ne korte) -and (cn -ne bela) Но я не мог понять, как Я использую t в фильтре - person adam_gav; 13.03.2012
comment
Вам, вероятно, будет лучше просто использовать фильтр ldap для GivenName, а затем использовать условие PS для результатов: {GivenName -eq $ GivenName} | где {$ hatelist -notcontains $ _. CN} - person mjolinor; 13.03.2012