Как добавить ошибку из Get-ADComputer в таблицу? - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь запросить несколько компьютеров из домена с помощью Get-ADComputer.Я хотел бы добавить имя компьютера, которое я запросил, в массив со словом «error» или бессмысленной датой или даже пустым значением в этом месте.

Import-Module ActiveDirectory
$PCNames = "laptop-namea", "laptop-nameb", "laptop-badname"
$Output = @()
$Output = foreach ($PC in $PCNames) {
    try {
        Get-ADComputer -Identity $PC -Properties * |
            Select-Object Name, LastLogonDate
    } catch {
        $Output += ($PC)
    }
}

Текущий вывод:

Name         LastLogonDate        
----         -------------        
LAPTOP-NAMEA 1/27/2019 10:37:13 AM
LAPTOP-NAMEB 1/22/2019 8:23:02 AM 

Требуемый / ожидаемый результат:

Name           LastLogonDate        
----           -------------        
LAPTOP-NAMEA   1/27/2019 10:37:13 AM
LAPTOP-NAMEB   1/22/2019 8:23:02 AM 
LAPTOP-BADNAME 

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Используйте -Filter вместо -Identity, чтобы избежать выдачи ошибок в случае недопустимых имен.

$Output = foreach ($PC in $PCNames) {
    New-Object -Type PSObject -Property @{
        'Name'      = $PC
        'LastLogon' = Get-ADComputer -Filter "Name -eq '$PC'" -Property LastLogonDate |
                      Select-Object -Expand LastLogonDate
    }
}

Помните, что запрос AD для каждого отдельного компьютера отнимает много времени.Если число запросов выходит за пределы определенной точки, лучше запросить все компьютеры, поместить их в соответствующую структуру данных (обычно в хеш-таблицу), а затем найти нужную информацию в этой структуре данных.

$computers = @{}
Get-ADComputer -Filter '*' -Property LastLogonDate | ForEach-Object {
    $computers[$_.Name] = $_.LastLogonDate
}

$Output = foreach ($PC in $PCNames) {
    New-Object -Type PSObject -Property @{
        'Name'      = $PC
        'LastLogon' = $computers[$PC].LastLogonDate
    }
}
0 голосов
/ 31 января 2019

Try - Catch - Finally блоки обрабатывать завершать ошибки.Примените общий параметр -ErrorAction -Stop следующим образом:

Import-Module ActiveDirectory
$PCNames = "laptop-namea","laptop-nameb","laptop-badname"
$Output = ForEach ($PC in $PCNames) 
    {
        try{
            Get-ADComputer -Identity $PC -Properties * -ErrorAction Stop | 
                Select-Object Name, LastLogonDate
            } 
        catch{
            [PSCustomObject]@{Name=$PC;LastLogonDate=$null}
            }
    }
...