#powershell
#powershell
Вопрос:
У меня есть этот сценарий ниже, и на входе больше строк, чем на выходе. Я предполагаю, что это потому, что импорт технически является экспортом из системы, которую я проверяю, которую скрипт не может найти в AD. Как мне добавить catch для уведомления, который не может быть найден в AD?
Import-Csv "C:tempusers.csv" |
%{ Get-AdUser -filter "name -like '$($_.Name)'" } |
Select Name, enabled |
Export-csv -path C:tempcompleteaudit.csv -NoTypeInformation
Вот пример ввода:
Name
Jane Doe
Вот пример вывода:
Name enabled
Jane Doe TRUE
Ответ №1:
Одним из способов добиться этого было бы вывести входные данные, но добавить вычисляемое свойство к каждому элементу. Вот пример того, как вы могли бы это сделать:
Import-Csv "C:tempusers.csv" |
Select Name, @{l='Enabled';e={(Get-AdUser -filter "name -like '$($_.Name)'").Enabled}} |
Export-csv -path C:tempcompleteaudit.csv -NoTypeInformation
Это создаст ваш CSV-файл со всеми отображаемыми пользователями ввода, и те, кто получил ответ от AD, будут иметь значение True / False в столбце Enabled , в то время как все, кто не был найден в AD, будут пустыми.
Очевидно, что вы могли бы добавить больше логики для проверки пустых результатов и заполнения чего-либо, или выдать предупреждение или что-то в этом роде, но это довольно простой способ убедиться, что все входные данные включены в выходные данные.
Ответ №2:
Я бы сделал это с помощью простого if{}..else{}
:
Import-Csv "C:tempusers.csv" |
ForEach-Object {
$nameToCheck = $_.Name
$user = Get-AdUser -Filter "name -eq '$nameToCheck'" -ErrorAction SilentlyContinue
# if the user could not be found, $user is $null
if ($user) {
$user | Select Name, Enabled
}
else {
Write-Warning "User $nameToCheck could not be found.."
}
} | Export-Csv -path C:tempcompleteaudit.csv -NoTypeInformation
-like
без подстановочных знаков будет делать то же -eq
самое, что и . Кроме того, имена в AD не уникальны, поэтому всегда лучше использовать для этого свойства типа DistinguishedName
, UserPrincipalName
или EmailAddress