Извлечение имени и фамилии из txt файла и использование его для получения имени пользователя из AD и его импорта в csv - PullRequest
0 голосов
/ 01 августа 2020

в качестве теста и способа получить определенные c данные из AD. Я пытаюсь получить данные на основе текстового файла, заполненного именами и фамилиями пользователей. Я выяснил, что использование командлета ConvertFrom-String позволяет разделить имена внутри текстового файла на два отдельных значения, что позволяет использовать (теоретически) Get-ADUser для поиска пользователя из AD и его атрибутов.

Код, который я использовал до сих пор, следующий, со случайными изменениями здесь и там, когда я пробовал различные варианты, чтобы заставить его работать. Мне удалось получить нужные мне данные, сохранив имена в переменных, а затем используя командлет Get-ADUser, чтобы забрать их из AD, я даже смог экспортировать эти данные в файл CSV. Проблема в том, что не удается заставить его работать, когда есть текстовый файл, заполненный несколькими записями.

Get-Content C:\temp\users.txt -encoding UTF8 |
ConvertFrom-String |
ForEach-Object {Get-ADUser -Filter {(givenName -Like '$($_.P1)') -and (sn -Like '$($_.P2)')} -Properties *} |
Select-object givenName, Surname, SamAccountName | Export-CSV C:\Temp\usersexport.csv -NoTypeInformation

Любая помощь будет очень признательна.

1 Ответ

0 голосов
/ 01 августа 2020

Вы используете подвыражение внутри нерасширяющейся строки. Ознакомьтесь с Powershell about_Quoting_Rules help topi c для получения более подробной информации. Но вкратце, вам нужны двойные кавычки, чтобы раскрыть что-то вроде $($_).

Что-то вроде:

Get-Content C:\temp\users.txt -encoding UTF8 |
ConvertFrom-String |
ForEach-Object {Get-ADUser -Filter "( givenName -like '$($_.P1)' ) -and (sn -like '$($_.P2)' )" -Properties *} |
Select-object givenName, Surname, SamAccountName | Export-CSV C:\Temp\usersexport.csv -NoTypeInformation

Обратите внимание, что я процитировал весь фильтр. Технически Get-ADUser параметр -Filter принимает строку, так что это приемлемо и упрощает чтение.

Также обратите внимание: вам может понадобиться "*", чтобы это работало правильно. Технически -like будет работать с точными совпадениями, но чаще используется при поиске с использованием подстановочных знаков. В вашем случае использование '*$($_.P1)*' может помочь вам решить эту проблему.

Если вы уверены в значениях, особенно учитывая, что вы также используете оператор -and, вы можете подумать об использовании -eq. Однако я был бы обеспокоен, так как всегда есть вероятность столкновения общих имен. Например, в США в AD легко может быть 2 John Smiths ...

Я бы также заметил, что для этого более целесообразно использовать Import-CSV. После исправления ваш подход работает, но, в первую очередь, он более читабелен и его проще писать:

Пример с -eq:

Import-Csv -Path C:\temp\users.txt -header "givenName","sn" -Delimiter " " |
ForEach-Object{
    $GivenName = $_.givenName
    $LastName  = $_.sn
    ForEach-Object { Get-ADUser -Filter "(givenName -eq '$GivenName') -and (sn -eq '$LastName')" -Properties * }
} | 
Select-Object givenName, Surname, SamAccountName | 
Export-CSV C:\Temp\usersexport.csv -NoTypeInformation

Пример с -like и подстановочными знаками:

Import-Csv -Path C:\temp\users.txt -header "givenName","sn" -Delimiter " " |
ForEach-Object{
    $GivenName = $_.givenName
    $LastName  = $_.sn
    ForEach-Object { Get-ADUser -Filter "(givenName -like '*$GivenName*') -and (sn -like '*$LastName*')" -Properties * }
} | 
Select-Object givenName, Surname, SamAccountName | 
Export-CSV C:\Temp\usersexport.csv -NoTypeInformation

Вы также можете избежать -Properties * и вместо этого определить более точный набор свойств для извлечения. В более крупных проектах, которые могут повлиять на производительность.

Да, и, кстати, вам обычно не нужно указывать кодировку для Get-Content, это очень хорошо помогает понять это самостоятельно.

В PowerShell Core значение по умолчанию для параметра - UTF8NoBOM. NoBOM просто означает, что нет «метки порядка байтов», объявляющей кодировку, и поэтому у него не должно быть никаких проблем с файлом UTF8. В Windows PowerShell 5.1 вам может потребоваться указать его так же, как и у вас.

Похоже, это обучающее упражнение для вас, дайте мне знать, если это поможет.

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