我有一个来自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
}
答案 0 :(得分:4)
Gabriel Luci和Mathias 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中的name
和cn
属性(两个属性始终相同)。
还有DisplayName
(AD中的displayName
),GivenName
(givenName
)和Surname
(sn
)。您可以尝试与DisplayName
进行匹配:
Get-ADUser -Filter "DisplayName -eq '$($_.name)'"
如果这些属性中的任何一个都不与您的数据完全匹配,您将遇到麻烦。您所做的任何事情都可能不会对每个帐户有效。希望这只是一项一次性的工作,您可以分步进行(尝试一件事,拿出可行的东西,然后尝试其他的东西)。
您可以尝试使用AD的Ambiguous Name Resolution(ANR),它将匹配多个不同属性的搜索字符串,甚至匹配givenName
和sn
的名字和姓氏。这可能适用于您列表中的某些对象。您将这样使用它:
Get-ADUser -LDAPFilter "(anr=$($_.name))"
如果这些都不起作用,则必须拆分名称(例如,用空格$_.name.Split(" ")
),然后尝试将其匹配到不同的属性。您必须查看自己的数据,然后看看有什么用。
答案 2 :(得分:3)
一种方法是在Active Directory中使用Ambiguous Name Resolution功能。
它将对多个属性(例如displayName
,Name
和mail
属性(以及其他属性)进行模糊匹配,因此对于这种精确的情况,这非常有用不一定预先知道顺序或名称或全名:
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