Get-AdUser Поиск для каждого пользователя в списке csv с сопоставлением LDAPFilter
Я запрашиваю у AD сведения о пользователях, используя список имен пользователей, полученных из другого списка, что означает, что не все имена пользователей точно соответствуют SamAccountName, например, число или буква могут быть пропущены с конца. Я могу заставить работать поиск точных совпадений и вывести имена, которые он не может найти, но я хотел бы взять имена из этого списка и пропустить их через поиск LDAPFilter, чтобы также проверить нечеткие совпадения. Пока у меня есть:
ForEach($User in $List){
Write-host "Now checking $User"
Try{
Get-ADUser -LDAPFilter "(anr=$User)" -Properties * |
select-object DisplayName,UserPrincipalName,mail,Enabled |
Export-CSV -Append $OutputFileResults -NoTypeInformation
Write-host "$User found successfully" -foregroundcolor Green
}
Catch{
$User | Export-CSV -Append $OutputFileFailed -NoTypeInformation
Write-host "$User not found" -foregroundcolor Red
}
}
На данный момент вывод, который я получаю, просто говорит, что имя пользователя было успешно найдено, но ничего не записывает в выходной файл.
2 ответа
Get-ADUser -LDAPFilter ...
не выдает исключение, когда пользователи не найдены, поэтому тот факт, что имя пользователя было найдено, ничего вам не говорит - он бы сказал вам об этом, нашел ли он 0 или 100 :)
Явно проверьте, действительно ли он возвращает что-либо, чтобы заставить его работать:
ForEach($User in $List){
Write-host "Now checking $User"
Try {
# search for matching users
$matchingUsers = Get-ADUser -LDAPFilter "(anr=$User)" -Properties * |
Select-object DisplayName,UserPrincipalName,mail,Enabled
if(-not $matchingUsers){
# no users found? throw to enter the catch block
throw
}
# otherwise proceed to export to CSV
$matching |Export-CSV -Append $OutputFileResults -NoTypeInformation
Write-host "$User found successfully" -foregroundcolor Green
}
Catch {
$User | Export-CSV -Append $OutputFileFailed -NoTypeInformation
Write-host "$User not found" -foregroundcolor Red
}
}
Try/Catch не обязательно всегда лучший способ обработки проверок, чтобы увидеть, были ли возвращены объекты. Лично я бы вместо этого использовал оператор if/else. В условии мы присваиваем результат Get-ADUser, а затем проверяем, пуст он или нет. Если он не пуст, то продолжаем в
if
блокировать. Если
$matchedUsers
пусто, то
else
блок запущен.
ForEach ($User in $List) {
Write-Host "Now checking $User"
if ($matchedUsers = Get-ADUser -LDAPFilter "(anr=$User)" -Properties *) {
$matchedUsers | Select-Object DisplayName, UserPrincipalName, mail, Enabled |
Export-Csv -Append $OutputFileResults -NoTypeInformation
Write-Host "$User found successfully" -ForegroundColor Green
}
else {
$User | Export-Csv -Append $OutputFileFailed -NoTypeInformation
Write-Host "$User not found" -ForegroundColor Red
}
}