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

Get-ADUser в цикле foreach ничего не возвращает при использовании объекта

$users = Get-Content "C:\PowerShellScript\CSV\swyxusers.csv"


$test = Foreach ($user in $users){
Get-ADUser -Filter {Name -like "*$user*" } | Select-Object SamAccountName, Enabled
} 

$test| export-csv -Force -Append "C:\PowerShellScript\CSV\skit.csv"

Запуск выше, ничего не экспортируется в CSV, но если я добавлю Write-Host "$User" он экспортирует список пользователей. Итак, я знаю, что функция экспорта работает.

Если я запустил это так:

$users = Get-Content "C:\PowerShellScript\CSV\swyxusers.csv"


$test = Foreach ($user in $users){
Get-ADUser -Filter {Name -like "*User 1*" } | Select-Object SamAccountName, Enabled
} 

$test| export-csv -Force -Append "C:\PowerShellScript\CSV\skit.csv"

Он заполняет мой CSV результатом «Пользователь 1» (первый пользователь в документе, и это исключенный результат) для количества раз, когда в переменной $ user есть строки. Итак, я знаю, что мой метод поиска работает.

Итак, мой вопрос / проблема в том, как заставить его пройти через мой CSV-файл и действительно найти что-нибудь при поиске с использованием объекта? Поскольку он работает, когда я использую введенную вручную строку, но не при использовании объекта.

CSV сформирован следующим образом:

USER 1
USER 2
USER 3
USER 4 

Изменить: проблема не связана с циклом foreach, если я запустил следующее:

$test = "TEST USER"
Get-ADUser -Filter {Name -eq "*$test*"}

это все еще не работает, должно быть что-то с тем, как выполняется фильтрация.

Согласно моему комментарию под Эриком Шнабелем, вы не должны помещать переменную «$» в кавычки в фильтре. Ваш сценарий обновления должен включать подстановочный знак с переменной, чтобы фильтр работал

$users = Get-Content "C:\PowerShellScript\CSV\swyxusers.csv"

$test = Foreach ($user in $users){
    $user = "*" + $user + "*"
    Get-ADUser -Filter {Name -like $user } | Select-Object SamAccountName, Enabled} 

$test| export-csv -Force -Append "C:\PowerShellScript\CSV\skit.csv"

Обычно при создании поискового фильтра как комбинации нескольких строк я избегаю этого в самом вводе. Так, например (и как вы выяснили) вместо того, чтобы делать следующее

Get-ADUser -Filter {Name -like "*$user*"}

Я пытаюсь создать фильтр, а затем вызываю функцию

$filter = "*" + $user + "*"
Get-ADUser -Filter {Name -like $filter}

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

Итак, как я сказал в моем редактировании, это было связано с фильтрацией. Я действительно чувствую себя довольно глупо, когда нашел решение.

Это не сработает:

Get-ADUser -Filter {Name -like "*$user*" }

Это тоже не сработает:

Get-ADUser -Filter {Name -like "$user" }

Но это работает:

Get-ADUser -Filter {Name -like $user}

Если у вас есть "или *", он сломается, и nu будет работать без сообщения об ошибке.

Нашел решение здесь: http://www.powershellish.com/blog/2015-11-17-ad-filter