在 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 {...}
),即使它可以工作,也可以 .
我已经编写了足够的 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 {...}
),即使它可以工作,也可以