Получить SamAccountName из списка различных имен - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть список имен, взятых из Oracle, для которых я пытаюсь найти SamAccountName.Файл представляет собой CSV, и некоторые имена являются «последними, первыми» или «последними, первыми и средними инициалами», а некоторые имеют три или четыре имени, например «альфа-браво чарли дельта».Имена в списке, вероятно, не совпадают с именами в 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 голосов
/ 29 ноября 2018

Ответы Габриэля Люси и Матиаса Р. Джессена дают полезные советы по "нечеткой" фильтрации пользователей AD . [1]

Однако ваша основная проблема заключается в том, что ваш ForEach-Object вызов не получает конвейерный вход , поскольку вы не подключили его к выходу из вызова Import-Csv.

  • Просто объедините две команды с помощью |:

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

Во-вторых, ваш -Filter аргумент { Name -like "'$($_.name)'"} по ошибке применяется два слоя цитирования и пропущены символы подстановки , учитывая, что -like сравнивается с полем всего поля , но вы хотите substring match.

  • Поскольку лучше избегать использования блоков скриптов ({ ... }) в качестве -Filter аргументов , используйте string :

    "Name -like `"*$($_.name)*`"" # Note the enclosing '*' to match substrings
    
  • Обратите внимание, что я использовал встроенное цитирование " (экранировано как `") вместо ', чтобы не сломать фильтрсимена, которые содержат ', такие как O'Malley.

  • Тем не менее, , если, как предполагает ваш вопрос, имена в ваших данных CSV не являются прямыми подстрокамиДля свойств AD пользователей .Name, указанного выше фильтра будет не , и даже техники ANR (разрешения неоднозначных имен), показанной в связанных ответах, может быть недостаточно.

В-третьих, ваш Export-Csv вызов неуместен : поскольку он находится внутри блока сценария ForEach-Object, один и тот же выходной файл перезаписывается на каждой итерации.

  • Перестройте команду следующим образом:

     Import-Csv ... | ForEach-Object { ... } | Export-Csv ...
    

Необязательное чтение: ForEach-Object поведение при не обеспечение конвейерного ввода :

  • Связанный блок сценария выполняется один раз .

  • $_,Автоматическая переменная, которая содержит текущий входной объект, имеет вид $null.


[1] Обратите внимание, что поисковый термин вфильтру LDAP может потребоваться экранирование ;согласно этой статье , символы * ( ) \ NUL требуют экранирования и должны экранироваться как \<hh>, где <hh> - шестнадцатеричное представление ASCII-кода символа (например, * должно бытьэкранируется как \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", $escapedName будет преобразовываться в литерал James\2A \28Jimmy\29 Smith\5CSmyth\00

0 голосов
/ 29 ноября 2018

Вы можете попробовать что-то вроде следующего:

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
0 голосов
/ 29 ноября 2018

Один из подходов заключается в использовании функции Разрешение неоднозначных имен в Active Directory.

Это приведет к нечеткому сопоставлению нескольких атрибутов, таких как displayName, Name и mail атрибутов (среди прочих), так что это довольно хорошо для такого точного сценария, когда вы не обязательно заранее знаете порядок, имена или полное имя:

Get-ADUser -LDAPFilter "(&(anr=$($_.name)))"
0 голосов
/ 29 ноября 2018

Я рекомендую использовать LDAPFilter и разрешение неоднозначных имен (anr) с Get-ADUser.Алгоритм ищет несколько полей имени в разных порядках, чтобы найти совпадения:

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

Или изменив код:

Get-ADUser -LDAPFilter "(anr=$($_.name))"
0 голосов
/ 29 ноября 2018

Помните, что имена свойств в PowerShell не называются так же, как атрибуты в AD.Свойство Name соответствует атрибутам name и cn в AD (оба атрибута всегда одинаковы).

Существует также DisplayName (displayName в AD), GivenName (givenName) и Surname (sn).Вы можете попробовать сопоставить с DisplayName:

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

Если ни одно из этих свойств не соответствует вашим данным точно, у вас будут некоторые проблемы.Ни одна вещь, которую вы делаете, вероятно, не будет работать для каждой учетной записи.Надеюсь, это просто разовая работа, и вы можете поработать над ними по частям (попробуйте одну вещь, выньте ту, которая работает, и попробуйте что-то другое в остальном).

Одна вещь, которую вы можете попробовать, этоиспользуя AD разрешение неоднозначных имен (ANR), которое сопоставит строку поиска с несколькими различными атрибутами и даже сопоставит имя и фамилию с givenName и sn.Это может работать с некоторыми в вашем списке.Вы можете использовать его следующим образом:

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

Если ничего из этого не работает, вам придется разделить имена (например, по пробелам: $_.name.Split(" ")) и попытаться сопоставить его части с разнымиатрибутов.Вам придется посмотреть на ваши данные и посмотреть, что работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...