首页 > 解决方案 > 如何将 Get-ADComputer 中的错误附加到表中?

问题描述

我正在尝试使用 Get-ADComputer 从域中查询多台计算机。我想将我查询的电脑名称附加到数组中,其中包含“错误”一词或无意义的日期,甚至是该位置的空白值。

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)
    }
}

电流输出:

姓名 LastLogonDate        
---- -------------        
笔记本电脑名称A 1/27/2019 10:37:13 AM
笔记本电脑-NAMEB 1/22/2019 8:23:02 AM

想要/预期的输出:

姓名 LastLogonDate        
---- -------------        
笔记本电脑名称A 1/27/2019 10:37:13 AM
笔记本电脑-NAMEB 1/22/2019 8:23:02 AM
笔记本电脑坏名

标签: powershellforeachactive-directory

解决方案


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

推荐阅读