从各种名称列表中获取SamAccountName

时间:2018-11-29 13:41:33

标签: powershell active-directory

我有一个来自Oracle的名称列表,我正试图为其寻找SamAccountName。该文件是CSV文件,有些名称是“姓氏,名字”或“姓氏,中间名首字母”,有些则具有三个或四个名称,例如“ alpha bravo charlie delta”。列表中的名称可能与AD中列出的名称不同。试图弄清楚如何对此进行分类以找到AD帐户。我目前拥有的代码无法产生任何结果。

Import-Module ActiveDirectory
Import-Csv "\\server\users\folder\Oracle_HR.csv" 

ForEach-Object{    
  Get-ADUser -Filter { Name -like "'$($_.name)'"} -Properties Name |
    Select-Object Name,SamAccountName |
      Export-CSV "\\server\users\folder\Oracle_ADs.csv" -NoTypeInformation
}

5 个答案:

答案 0 :(得分:4)

Gabriel LuciMathias R. Jessen的回答为AD用户的“模糊”过滤提供了很好的建议 [1]

但是,您的主要问题是您的ForEach-Object调用未收到管道输入,因为您尚未将其连接到Import-Csv调用的输出。

>
  • 只需将两个命令与|结合在一起:

     Import-Csv "\\server\users\folder\Oracle_HR.csv" | ForEach-Object { # ...
    

其次,您的 -Filter参数{ Name -like "'$($_.name)'"}错误地使用了引号,并且缺少通配符,假设-like整个字段进行比较,但是您想要 substring 匹配。

  • 由于最好使用avoid the use of script blocks ({ ... }) as -Filter arguments,请使用 string

    "Name -like `"*$($_.name)*`"" # Note the enclosing '*' to match substrings
    
  • 请注意,我使用了嵌入式"引号(转义为`")而不是'引号,以免使用包含{{ 1}},例如'

  • 这就是说,如果您的问题所提示的那样,如果CSV数据中的名称不是AD用户的O'Malley属性值的直接子字符串,则上述过滤器将 还不够,甚至链接答案中显示的ANR(歧义名称解析)技术也可能不够。

第三,您的.Name调用放错了位置:由于它位于Export-Csv脚本块中,因此每次迭代都会覆盖相同的输出文件。

  • 按如下所示重组命令:

    ForEach-Object

可选阅读: Import-Csv ... | ForEach-Object { ... } | Export-Csv ... 不提供管道输入时的行为

  • 关联的脚本块一次执行

  • ForEach-Object是包含当前输入对象的自动变量,是$_


[1]请注意,LDAP过滤器中的搜索词可能需要转义 ;对于每个this article,字符$null需要转义,并且必须转义为* ( ) \ NUL,其中\<hh>是字符的ASCII码的两位十六进制表示(例如,{{ 1}}必须以<hh>的形式转义:

*

\2A包含字符串$escapedName = -join $(foreach ($c in [char[]] $_.name) { if ('*', '\', '(', ')', "`0" -contains $c) { '\' + ([int] $c).ToString('X2') } else { $c } }) Get-ADUser -LDAPFilter "(anr=$escapedName)" 的情况下,$_.name的计算结果为文字"James* (Jimmy) Smith\Smyth`0"

答案 1 :(得分:3)

请记住,PowerShell中的属性名称与AD中的属性名称不同。 Name属性对应于AD中的namecn属性(两个属性始终相同)。

还有DisplayName(AD中的displayName),GivenNamegivenName)和Surnamesn)。您可以尝试与DisplayName进行匹配:

Get-ADUser -Filter "DisplayName -eq '$($_.name)'"

如果这些属性中的任何一个都不与您的数据完全匹配,您将遇到麻烦。您所做的任何事情都可能不会对每个帐户有效。希望这只是一项一次性的工作,您可以分步进行(尝试一件事,拿出可行的东西,然后尝试其他的东西)。

您可以尝试使用AD的Ambiguous Name Resolution(ANR),它将匹配多个不同属性的搜索字符串,甚至匹配givenNamesn的名字和姓氏。这可能适用于您列表中的某些对象。您将这样使用它:

Get-ADUser -LDAPFilter "(anr=$($_.name))"

如果这些都不起作用,则必须拆分名称(例如,用空格$_.name.Split(" ")),然后尝试将其匹配到不同的属性。您必须查看自己的数据,然后看看有什么用。

答案 2 :(得分:3)

一种方法是在Active Directory中使用Ambiguous Name Resolution功能。

它将对多个属性(例如displayNameNamemail属性(以及其他属性)进行模糊匹配,因此对于这种精确的情况,这非常有用不一定预先知道顺序或名称或全名:

Get-ADUser -LDAPFilter "(&(anr=$($_.name)))"

答案 3 :(得分:0)

我建议对LDAPFilter使用anr和模糊名称解析(Get-ADUser)。该算法以不同的顺序查找几个名称字段以查找匹配项:

Get-ADUser -LDAPFilter "(anr=John Doe)"

或修改您的代码:

Get-ADUser -LDAPFilter "(anr=$($_.name))"

答案 4 :(得分:0)

您可以尝试以下操作:

Import-Module ActiveDirectory
$allUsers = Get-Content "\\server\users\folder\Oracle_HR.csv"
$users = @()
ForEach($obj in $allUsers){
    $user = Get-ADUser -Filter { GivenName -like $obj} -Properties Name, samAccountName
    if(!$user){
        $user = Get-ADUser -Filter { SurName -like $obj} -Properties Name, samAccountName
    }
    if(!$user){
        $user = Get-ADUser -Filter { Name -like $obj} -Properties Name, samAccountName
    }
    if(!$user){
        Write-Host "User $obj could not be found" -ForegroundColor Red
    }else{
        $users += $user
    }       
}

$users | Select-Object Name,SamAccountName | Export-CSV "\\server\users\folder\Oracle_ADs.csv" -NoTypeInformation

您可能还需要分割这些值,例如:

Import-Module ActiveDirectory
$allUsers = Get-Content "\\server\users\folder\Oracle_HR.csv"
$users = @()
ForEach($obj in $allUsers){
    $objSplit = $obj.Split(",")
    foreach($split in $objSplit){
        $user = Get-ADUser -Filter { GivenName -like $split} -Properties Name, samAccountName
        if(!$user){
            $user = Get-ADUser -Filter { SurName -like $split} -Properties Name, samAccountName
        }
        if(!$user){
            $user = Get-ADUser -Filter { Name -like $split} -Properties Name, samAccountName
        }
        if(!$user){
            Write-Host "User $split could not be found" -ForegroundColor Red
        }else{
            if($users.samAccountName -notcontains $user.SamAccountName){
                $users += $user
            }
        }
    }      
}

$users | Select-Object Name,SamAccountName | Export-CSV "\\server\users\folder\Oracle_ADs.csv" -NoTypeInformation