我正在使用从不同列表派生的用户名列表向AD查询用户详细信息,这意味着并非所有用户名都与SamAccountName完全匹配,例如,可能会从末尾删除一个数字或字母。我可以进行精确的匹配查找,并输出它找不到的名称,但我想使用该列表名称,并通过LDAFilter或搜索运行它们,以检查模糊匹配。到目前为止,我有:
ForEach($User in $List){
Write-host "Now checking $User"
Try{
Get-ADUser -LDAPFilter "(anr=$User)" -Properties * |
select-object DisplayName,UserPrincipalName,mail,Enabled |
Export-CSV -Append $OutputFileResults -NoTypeInformation
Write-host "$User found successfully" -foregroundcolor Green
}
Catch{
$User | Export-CSV -Append $OutputFileFailed -NoTypeInformation
Write-host "$User not found" -foregroundcolor Red
}
}
目前,我得到的输出只是说成功找到了用户名,但没有向输出文件中写入任何内容。
Get-ADUser -LDAPFilter ...
在找不到用户时不会抛出异常,所以说找到了用户名的事实告诉你什么都没有-它会告诉你它找到了0还是100:(
明确测试它是否真的返回了任何东西来使其工作:
ForEach($User in $List){
Write-host "Now checking $User"
Try {
# search for matching users
$matchingUsers = Get-ADUser -LDAPFilter "(anr=$User)" -Properties * |
Select-object DisplayName,UserPrincipalName,mail,Enabled
if(-not $matchingUsers){
# no users found? throw to enter the catch block
throw
}
# otherwise proceed to export to CSV
$matching |Export-CSV -Append $OutputFileResults -NoTypeInformation
Write-host "$User found successfully" -foregroundcolor Green
}
Catch {
$User | Export-CSV -Append $OutputFileFailed -NoTypeInformation
Write-host "$User not found" -foregroundcolor Red
}
}
Try/Catch不一定总是处理检查是否返回对象的最佳方式。就我个人而言,我会使用if/else语句。在if
条件中,我们将Get-ADUser的结果分配给$matchedUsers
,然后检查它是否为空。如果它不是空的,那么我们继续进入if
块。如果$matchedUsers
为空,则运行else
块。
ForEach ($User in $List) {
Write-Host "Now checking $User"
if ($matchedUsers = Get-ADUser -LDAPFilter "(anr=$User)" -Properties *) {
$matchedUsers | Select-Object DisplayName, UserPrincipalName, mail, Enabled |
Export-Csv -Append $OutputFileResults -NoTypeInformation
Write-Host "$User found successfully" -ForegroundColor Green
}
else {
$User | Export-Csv -Append $OutputFileFailed -NoTypeInformation
Write-Host "$User not found" -ForegroundColor Red
}
}