Powershell 从各种名称列表中获取SamAccountName

Powershell 从各种名称列表中获取SamAccountName,powershell,active-directory,Powershell,Active Directory,我有一个从甲骨文中提取的名字列表,我正试图找到它的SamAccountName。该文件是一个CSV文件,有些名称是last、first或last、first-middle首字母,有些有三个或四个名称,如alpha bravo charlie delta。列表中的名称可能与广告中列出的名称不同。正在尝试找出如何通过此项进行排序以查找广告帐户。我目前拥有的代码没有产生任何结果 Import-Module ActiveDirectory Import-Csv "\\server\users\folde

我有一个从甲骨文中提取的名字列表,我正试图找到它的SamAccountName。该文件是一个CSV文件,有些名称是last、first或last、first-middle首字母,有些有三个或四个名称,如alpha bravo charlie delta。列表中的名称可能与广告中列出的名称不同。正在尝试找出如何通过此项进行排序以查找广告帐户。我目前拥有的代码没有产生任何结果

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
}

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

广告中还有DisplayName DisplayName、GivenName GivenName和姓氏sn。您可以尝试与DisplayName进行匹配:

如果这些属性都与您的数据不完全匹配,您将遇到一些问题。你做的任何一件事都不可能适用于所有客户。希望这只是一个一次性的工作,你可以一件一件地完成,尝试一件事,去掉那些有效的,然后在其余的事情上尝试不同的东西

您可以尝试使用AD的ANR,它将搜索字符串与几个不同的属性相匹配,甚至将名字和姓氏与givenName和sn相匹配。这可能适用于您列表中的一些。您可以这样使用它:

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

如果这些都不起作用,则必须拆分名称,例如,按空格:$\ux.name.split并尝试将其片段与不同的属性相匹配。您必须查看您的数据,看看哪些方法有效。

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

广告中还有DisplayName DisplayName、GivenName GivenName和姓氏sn。您可以尝试与DisplayName进行匹配:

如果这些属性都与您的数据不完全匹配,您将遇到一些问题。你做的任何一件事都不可能适用于所有客户。希望这只是一个一次性的工作,你可以一件一件地完成,尝试一件事,去掉那些有效的,然后在其余的事情上尝试不同的东西

您可以尝试使用AD的ANR,它将搜索字符串与几个不同的属性相匹配,甚至将名字和姓氏与givenName和sn相匹配。这可能适用于您列表中的一些。您可以这样使用它:

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

如果这些都不起作用,则必须拆分名称,例如,按空格:$\ux.name.split并尝试将其片段与不同的属性相匹配。您必须查看您的数据,看看哪些功能有效。

一种方法是在Active Directory中使用该功能

它将对多个属性进行模糊匹配,例如displayName、Name和mail属性等,因此对于这种您不必预先知道顺序、名称或全名的情况非常适合:

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

一种方法是在Active Directory中使用该功能

它将对多个属性进行模糊匹配,例如displayName、Name和mail属性等,因此对于这种您不必预先知道顺序、名称或全名的情况非常适合:

Get-ADUser -LDAPFilter "(&(anr=$($_.name)))"
我建议使用LDAPFilter和带有Get ADUser的不明确名称解析anr。该算法按不同顺序查找多个名称字段以查找匹配项:

Get-ADUser -LDAPFilter "(anr=John Doe)"
或修改您的代码:

Get-ADUser -LDAPFilter "(anr=$($_.name))"
我建议使用LDAPFilter和带有Get ADUser的不明确名称解析anr。该算法按不同顺序查找多个名称字段以查找匹配项:

Get-ADUser -LDAPFilter "(anr=John Doe)"
或修改您的代码:

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

您可以尝试以下方法:

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

您可以尝试以下方法:

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
这些答案是对广告用户的模糊过滤提出了很好的建议。[1]

但是,您的主要问题是ForEach对象调用没有接收管道输入,因为您没有将其连接到Import Csv调用的输出

只需使用|连接两个命令即可:

其次,您的-Filter参数{Name-like'$$\.Name'}错误地应用了两层引号,并且缺少通配符,因为类通配符与整个字段进行比较,但您需要子字符串匹配

因为最好使用字符串:

请注意,我使用的嵌入式引号转义为`而不是`quoting',这样就不会用包含`O'Malley`的名称破坏过滤器

也就是说,如果如您的问题所示,您的CSV数据中的名称不是广告用户名称属性值的直接子字符串,则上述过滤器将不够,甚至链接答案中显示的ANR模糊名称解析技术也可能不够

第三,您的导出Csv调用放错了位置 :因为它位于ForEach对象脚本块内,所以在每次迭代中都会覆盖相同的输出文件

按如下方式重新构造命令:

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

关联的脚本块执行一次

$\包含当前输入对象的自动变量为$null

[1] 请注意,LDAP筛选器中的搜索项可能需要转义;根据,字符*\NUL需要转义,必须转义为\,其中是字符ASCII码的两位十六进制表示形式,例如,*必须转义为\2A:

使用包含字符串James*Jimmy Smith\Smyth`0的$\uu.name,$escapedName将计算为文字James\2A\28Jimmy\29 Smith\5CSmyth\00

的答案,并对广告用户的模糊过滤给出很好的建议。[1]

但是,您的主要问题是ForEach对象调用没有接收管道输入,因为您没有将其连接到Import Csv调用的输出

只需使用|连接两个命令即可:

其次,您的-Filter参数{Name-like'$$\.Name'}错误地应用了两层引号,并且缺少通配符,因为类通配符与整个字段进行比较,但您需要子字符串匹配

因为最好使用字符串:

请注意,我使用的嵌入式引号转义为`而不是`quoting',这样就不会用包含`O'Malley`的名称破坏过滤器

也就是说,如果如您的问题所示,您的CSV数据中的名称不是广告用户名称属性值的直接子字符串,则上述过滤器将不够,甚至链接答案中显示的ANR模糊名称解析技术也可能不够

第三,导出Csv调用放错了位置:因为它位于ForEach对象脚本块内,所以每次迭代都会覆盖相同的输出文件

按如下方式重新构造命令:

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

关联的脚本块执行一次

$\包含当前输入对象的自动变量为$null

[1] 请注意,LDAP筛选器中的搜索项可能需要转义;根据,字符*\NUL需要转义,必须转义为\,其中是字符ASCII码的两位十六进制表示形式,例如,*必须转义为\2A:


使用包含字符串James*Jimmy Smith\Smyth`0的$\uu.name,$escapedName将计算为文字James\2A\28Jimmy\29 Smith\5CSmyth\00

作为旁白:最好。作为旁白:最好。我将其用作筛选器时出错。”Get ADUser:无法识别搜索筛选器“请查看@mklement0的答案以了解原因。我将其用作筛选器时出错。”Get ADUser:search filter无法识别“请查看@mklement0的答案以了解原因。遗憾的是,他们都没有给出任何结果,但是谢谢。遗憾的是,他们都没有给出任何结果,但是谢谢。