我正在尝试使用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
答案 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
}
}