Powershell 使用DisplayName查找广告用户信息

Powershell 使用DisplayName查找广告用户信息,powershell,active-directory,Powershell,Active Directory,我有一个显示名列表,我需要得到他们的广告信息 Get-Content "C:\displaynames.txt" | foreach { $givenname,$surname = $_ -split ' ' if (Get-ADUser -Filter "surname -eq '$surname' -and givenname -eq '$givenname'"){ G

我有一个显示名列表,我需要得到他们的广告信息

Get-Content "C:\displaynames.txt" |
foreach {
    $givenname,$surname = $_ -split ' '
                 if (Get-ADUser -Filter "surname -eq '$surname' -and givenname -eq '$givenname'"){
                     Get-ADUser -Filter { displayName -match $_} -Properties EmailAddress, Manager | Select Givenname, Surname, SamAccountName, EmailAddress, Manager}
                  else {Get-ADUser -Filter { displayName -like "AD Test"} -Properties EmailAddress, Manager | Select Givenname, Surname, SamAccountName, EmailAddress, Manager}  
     } | Export-Csv -Path C:\result.csv
这很好,但前提是用户没有中间名,例如John Moore 如果用户有一个中间名,它不会选择它。
如何更改脚本,使其能够接收中间名用户,例如John Roger Moore?

这里的基本问题是如何解释中间名

PowerShell 5有一些AI支持的cmdlet

这里,我将引用文档中的一个示例

示例2:简化字符串的格式 第一个命令创建一个包含名字、中间名和姓氏的数组。请注意,最后一个条目没有中间名

第二个命令根据示例格式化名称。它将姓氏放在输出的第一位,然后是名字。删除所有中间名;正确处理没有中间名的条目

如前所述,您可以直接在属性DisplayName上使用
-Filter

筛选器应该是字符串,而不是脚本块

使用
-Filter
还有一个优点,就是您可以抑制抛出的异常,因此我将在一个步骤中进行构建,以确认我们确实找到了具有该displayname的用户:

Get-Content "C:\displaynames.txt" | ForEach-Object {
    $user = Get-ADUSer -Filter "DisplayName -eq '$_'" -Properties DisplayName, EmailAddress, Manager -ErrorAction SilentlyContinue
    if ($user) {
        # output the wanted properties as **object**
        $user | Select-Object Givenname, Surname, SamAccountName, EmailAddress, Manager
    }
    else {
        # nobody in this domain with a displayname like that..
        Write-Warning "User '$_' could not be found.."
    }
} | Export-Csv -Path 'C:\result.csv' -NoTypeInformation

请注意,
Manager
属性的形式为managersdiscriminatedname。如果您想获取经理的其他属性,如他/她的姓名,则必须使用
get ADUser-Identity$user.manager
在那里获取想要的属性

这取决于您如何配置用户名信息,如姓名等。。。(例如,如果您将约翰·罗杰设置为姓名,然后将摩尔设置为姓氏,那么您也可以将约翰·罗杰设置为姓名。)为什么不直接在
displayName
上进行筛选:
Get ADUser-filter“displayName-eq'$'”
?我发现这篇帖子可能会有所帮助:
Get-Content "C:\displaynames.txt" | ForEach-Object {
    $user = Get-ADUSer -Filter "DisplayName -eq '$_'" -Properties DisplayName, EmailAddress, Manager -ErrorAction SilentlyContinue
    if ($user) {
        # output the wanted properties as **object**
        $user | Select-Object Givenname, Surname, SamAccountName, EmailAddress, Manager
    }
    else {
        # nobody in this domain with a displayname like that..
        Write-Warning "User '$_' could not be found.."
    }
} | Export-Csv -Path 'C:\result.csv' -NoTypeInformation