$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