从 DisplayName 列表中获取 AD 登录名的脚本

Script to get AD logon name from a list of DisplayName

我正在尝试使用此脚本从显示名称列表中获取 AD 用户的登录名列表。

Import-Csv 'C:\temp\displaynames.csv'
    ForEach-Object {
        $name = $_.displayname
        Get-ADUser -Filter * -Properties DisplayName | Where-Object {$_.displayname -eq $name}
    } |
    Select-Object SamAccountName, DisplayName |
    Export-Csv 'C:\Temp\Results.csv' -NoType

该脚本在 运行 看来没有错误,但我只得到显示名称没有空格的结果。难道我需要指定更多信息,例如域名?请问这可能是我的 displaynames.csv 列表的格式问题吗?

到目前为止我已经尝试过:

  1. 每行都有名字的列表(没有双引号或引号)
  2. 由“ ”封装的每个名称(即 'Joe Bloggs')
  3. 每个名称都由“”封装(即“Joe Bloggs”)

结果都一样。

我总是使用 Excel 来编辑和保存 CSV 文件,因为它总是会创建一个标准的有效 CSV 文件,并且它会处理所有引用。 CSV 应如下所示:

C:\temp\displaynames.csv

DisplayName
"Joe Bloggs"
"James Smith"

您现在的脚本效率很低。您循环访问的每个用户,您都会获得 all 个用户,然后使用 Where-Object 来查找您要查找的内容。简单地使用 Get-ADUser -Filter 命令为您完成所有工作要容易得多:

$CSV = Import-Csv 'C:\temp\displaynames.csv'
$CSV | ForEach-Object {
    $name = $_.displayname
    Get-ADUser -Filter {DisplayName -like $name} -Properties DisplayName
} | 
    Select-Object SamAccountName, DisplayName |
    Export-Csv 'C:\Temp\Results.csv' -NoType

您可以执行以下 LDAPFilter 技巧来一次查询所有用户,这应该与查询多个 Active Directory 用户时一样高效(使用 AD 模块;[adsi] 应该会更好)它虽然看起来不漂亮。我还为 CSV 的每个元素添加了一个 Trim,以删除可能导致问题的任何前导或尾随 space。

# Trim any trailing and leading spaces for each element
$users = (Import-Csv 'C:\temp\displaynames.csv').displayname.ForEach('Trim')

$filter = '(|(displayname={0}))' -f ($users -join ')(displayname=')
# - Something like:
#   $users = 'Joe Bloggs', 'John Doe', 'David Gilmour'
# - Becomes:
#   (|(displayname=Joe Bloggs)(displayname=John Doe)(displayname=David Gilmour))

Get-ADuser -LDAPFilter $filter -Properties DisplayName |
Select-Object samAccountName, DisplayName |
Export-Csv 'C:\Temp\Results.csv' -NoTypeInformation