Если пользователь не найден в скрипте Get-ADUser, выведите сообщение в мой CSV найденных пользователей

#powershell #active-directory

Вопрос:

У меня есть простой скрипт, который работает, берет список идентификаторов пользователей и выводит CSV с их идентификатором, включенным True / False, и их именем. Я пытаюсь понять, как я могу включить в него тест, в котором, если пользователь не найден на основе идентификатора во входном файле, мой вывод будет включать «Пользователь [идентификатор] удален». или что-то подобное.

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

 Get-Content $ENV:USERPROFILEdesktoptestusers.txt | ForEach {
    Get-ADUser -Filter "SamAccountName -eq '$_'" -Properties SamAccountName,Enabled,Name |
    Select SamAccountName,Enabled,Name
    } | Export-CSV -path $ENV:USERPROFILEdesktopoutput.csv -NoTypeInformation
 

Ответ №1:

Если я правильно понимаю, вы хотите, чтобы пользователи Get-ADUser не могли найти как ошибку и в выходном csv.

В этом случае просто попробуйте заставить пользователя проглотить сообщения об ошибках и использовать if{..} else {..} конструкцию, в которой в обоих случаях вы выводите объекты с одинаковыми свойствами:

 Get-Content "$env:USERPROFILEdesktoptestusers.txt" | Where-Object { $_ -match 'S' } | ForEach-Object {
    $user = Get-ADUser -Filter "SamAccountName -eq '$_'" -ErrorAction SilentlyContinue
    if ($user) {
        # output the properties you need in the csv
        $user | Select-Object SamAccountName, Enabled, Name
    }
    else {
        # user does not exist; output a similar object with the error
        [PsCustomObject]@{
            SamAccountName = "User '$_' does not exist"
            Enabled        = $null
            Name           = $null
        }
    }
} | Export-CSV -path "$env:USERPROFILEdesktopoutput.csv" -NoTypeInformation 
 

Комментарии:

1. Да, вот и все. Я даже не думал о вызове пользовательского объекта для хранения фиктивных данных для не найденного пользователя (честно говоря, я не занимался PS, может быть, десять лет?). Спасибо!

Ответ №2:

Это отобразит предупреждение для тех пользователей, которых не удалось найти.

Примечание -Properties SamAccountName,Enabled,Name . В этом случае не требуется, 3 свойства являются свойствами командлета по умолчанию.

 $dom = (Get-ADRootDSE).defaultNamingContext

Get-Content $ENV:USERPROFILEdesktoptestusers.txt | ForEach-Object {

    if([string]::IsNullOrWhiteSpace($_)){
        continue # go to next iteration if this element is just white space
    }
    
    $usr = Get-ADUser -Filter "SamAccountName -eq '$_'" | Select SamAccountName,Enabled,Name
    
    if(-not $usr){
        Write-Warning "$_ could not be found on $dom"
        continue
    }

    $usr

} | Export-CSV -path $ENV:USERPROFILEdesktopoutput.csv -NoTypeInformation