在 Powershell 中使用 AD 'displayNames' 列表。如何指示未找到哪些用户?

Working with a list of AD 'displayNames' in Powershell. How to indicate which users were not found?

我已经编写了足够的 PS 代码来遍历 displayNames 的列表(例如“John Smith”、“Taylor Hanson”——所有这些都存储在单独的行中一个 txt 文件)将足够的数据吐回到另一个可用于邮件合并等的文本文件中。说服成千上万的员工简单地更新 Windows 就像打碎石头一样!它必须在某种程度上自动化...

这是代码...让用户打开特定文本文件并稍后保存的功能不在视图中...

$displayname = @()
$names = get-content $FileIN
foreach ($name in $names) {


    $displaynamedetails = Get-ADUser -filter { DisplayName -eq $name } | Select Name, GivenName,  Surname, UserPrincipalName
    $displayname += $displaynamedetails

}

$displayname | Export-Csv -NoTypeInformation -path $fileOUT -Encoding UTF8

有时,列表中的姓名可能拼写错误,或者员工可能已离开组织。

如果发生错误,是否可以将诸如“未找到”之类的语句写入文本文件的特定行(以便轻松可以对两个文件进行并排比较吗?

对于我试图找到的大多数其他解决方案,答案都是基于 samAccoutName 或将名字和姓氏合并在一起。在这里,我对显示名称特别感兴趣。

谢谢

你可以试一试,因为 -Filter-LDAPFilter 不会在找不到对象时抛出任何异常(除非你正在喂 null值),您可以添加一个 if 条件来检查将要存储 AD 用户对象的变量是否不为空,如果是,您可以添加此 "not found" 用户进入不同的数组。

$domain = (Get-ADRootDSE).DefaultNamingContext
$names = Get-Content $FileIN
$refNotFound = [System.Collections.Generic.List[string]]::new()

$displaynamedetails = foreach($name in $names)
{
    if($aduser = Get-ADUser -LDAPFilter "(DisplayName=$name)")
    {
        $aduser
        continue
    }

    $refNotFound.Add(
        "Cannot find an object with DisplayName: '$name' under: $domain"
    )
}

$displaynamedetails | Select-Object Name, GivenName,  Surname, UserPrincipalName |
Export-Csv -NoTypeInformation -path $fileOUT -Encoding UTF8

$refNotFound # => Here are the users that couldn't be found

旁注,考虑停止使用 $displayname = @()+= 作为
至于 AD Cmdlet,不支持使用基于脚本块的过滤 (-Filter {...}),即使它可以工作,也可以 .