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
    }
}
Другие вопросы по тегам