如何将错误从Get-ADComputer附加到表?

时间:2019-01-30 22:55:58

标签: powershell foreach active-directory

我正在尝试使用Get-ADComputer从域中查询多台计算机。我想将查询到的pc名称附加到该数组中,并在该位置添加“错误”,错误的日期或什至空白值。

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 :(得分:1)

Try - Catch - Finally blocks处理终止错误。如下应用通用参数-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}
            }
    }

答案 1 :(得分:1)

使用-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
    }
}