从 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 列表的格式问题吗?
到目前为止我已经尝试过:
- 每行都有名字的列表(没有双引号或引号)
- 由“ ”封装的每个名称(即 'Joe Bloggs')
- 每个名称都由“”封装(即“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
我正在尝试使用此脚本从显示名称列表中获取 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 列表的格式问题吗?
到目前为止我已经尝试过:
- 每行都有名字的列表(没有双引号或引号)
- 由“ ”封装的每个名称(即 'Joe Bloggs')
- 每个名称都由“”封装(即“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