【问题标题】:Working with a list of AD 'displayNames' in Powershell. How to indicate which users were not found?在 Powershell 中使用 AD 'displayNames' 列表。如何指示未找到哪些用户?
【发布时间】:2022-01-18 16:56:55
【问题描述】:

我已经编写了足够多的 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 或将名字和姓氏合并在一起。在这里,我对显示名称特别感兴趣。

谢谢

【问题讨论】:

  • Get-ADUser 找不到匹配的用户时,您是否检查过$DisplayNameDetails 的值?
  • 当我故意在“输入”列表中拼错一些 displayNames 名称时,PS shell 不会显示错误。这是我能给你的最好答案。
  • 它不会抛出错误。返回值是什么,即$DisplayNameDetails

标签: powershell active-directory


【解决方案1】:

您可以尝试一下,因为 -Filter-LDAPFilter 在找不到对象时不会抛出任何异常(除非您提供 null 值)您可以添加 @987654326 @条件检查要存储AD用户对象的变量是否不为空,如果是,您可以将此“未找到”用户添加到不同的数组中。

$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 = @()+= 代替well known reasons
至于 AD Cmdlet,不支持使用基于脚本块的过滤 (-Filter {...}),即使它可以工作,它也可以bring you problems in the future

【讨论】:

  • 这是一个很棒的帮助!我刚刚测试过了。有什么方法可以将 PS shell 输出,例如“找不到具有 DisplayName 的对象:'John Bob under....'”也可以写入输出的文本文件?
  • @WilliamLombard 是的,它可能可以完成,但我不确定您所说的 “也写入输出的文本文件” 是什么意思。您想在控制台上显示消息或在文本文件中添加此未找到的值吗?我没有关注
  • 这样可以看到文件顶部的标题,然后可以找到每个用户的详细信息,然后文件中的一行指示何时找不到用户。理由是我想比较“输入”和“输出”文件。两者上相同数量的行将是理想的。如果不能以编程方式完成,我理解。
  • @WilliamLombard mmm 我不确定我是否理解,你想修改$FileIN 所以每一行都写着$name + "Not Found"$name + "Found"
  • 这很酷。我想我只是手动将控制台中的行附加到输出文件的底部。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 2020-11-20
  • 2019-02-08
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 2020-08-31
相关资源
最近更新 更多