Импорт csv найдите учетную запись ad по атрибуту employeeid и экспортируйте в csv

Доброе утро,

Мне нужен сценарий Powershell для импорта CSV, поиска пользователей по атрибуту EmployeeID в AD и экспорта CSV, подтверждающего, что учетная запись отключена. Мне нужно только отображаемое имя, идентификатор сотрудника и включить / отключить в экспорте.

Я все еще новичок в Powershell, и я обычно могу вырезать / вставлять существующие сценарии и манипулировать ими, чтобы делать то, что мне нужно, но я не могу заставить это работать, и теперь мой код выглядит как швейцарский сыр после того, как мыши добрались до него. Вот что у меня есть, но я не уверен, что близок к тому, что мне нужно.

#Script Starts
$Users = Import-Csv "\folder\Test.csv"

Import-Module ActiveDirectory
$path = Split-Path -parent ".\folder\*.*"

#Create log date
$logdate = Get-Date -Format yyyy-MM-dd-THH.mm.ss
$logfile = $path + "\logs\$logdate.logfile.txt"

ForEach ($User In $Users)
{
   # Retrieve values from the csv by header name.
   $FirstName = $User.FirstName
   $LastName = $User.LastName
   $ID = $User.Employee 

   #Search AD for Attributes
   $UserSN = (Get-ADUser -LDAPFilter "(employeeID=$ID)").sAMAccountName
   $UserDN = (Get-ADUser -Identity $UserSN -Properties DisplayName).DisplayName
   $Enabled = (Get-ADUser -Identity $UserSN -Properties Enabled).Enabled
   Export-Csv -Path $logdate.ADEnabled-Disabled.csv -Append
} 
#Finish
1
0
1 944
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Для Export-Csv вам понадобится какой-то вход. В настоящее время вы ничего не экспортируете.

В идеале вы хотите создать массив всех своих элементов и экспортировать этот массив.

$x = @()
ForEach ($User In $Users)
{
   $x += [pscustomobject]@{
     FirstName = $User.FirstName
     LastName = $User.LastName
     #etc...
   }
} 

$x | Export-Csv -Path "$logdate.ADEnabled-Disabled.csv"

У вас есть ряд мелких проблем, но я думаю, это поможет вам добиться реальных результатов.

Спасибо за ответ, теперь он сообщает мне Get-ADUser: фильтр поиска не может быть распознан $ UserSN = ... По-видимому, моя переменная $ ID пуста, я записал ее в файл журнала, и он пуст ... Что я сделал не так ли с этим?

Strive for Awesomeness 10.08.2018 18:04

Я исправил пустую переменную $ ID, но по-прежнему получаю ошибку «фильтр поиска не может быть распознан». Любая помощь приветствуется.

Strive for Awesomeness 10.08.2018 18:18

Я бы распечатал $User | ConvertTo-JSON -Depth 10 и убедился, что вы используете правильное имя / структуру свойства.

Jacob Colvin 10.08.2018 18:19

Не уверен, по какой причине вы используете -LDAPFilter вместо -Filter?

Jacob Colvin 10.08.2018 18:22

Я использую -LDAPFilter, потому что сценарий, из которого я скопировал эту строку, сделал это, -Filter тоже не работает, я получаю Operator Not supported, когда меняю его на $ UserSN = (Get-ADUser -Filter "(employeeID = $ ID)" ) .sAMAccountName

Strive for Awesomeness 10.08.2018 18:32

-Filter имеет другой синтаксис. -Filter "employeeID -eq `"$ID`"" или -Filter "employeeID -like `"*$ID*`"" - правильный iirc.

Jacob Colvin 10.08.2018 18:59

Просит избегать длительных обсуждений в комментариях. Хотите переместить это в чат? У тебя есть время поговорить со мной об этом?

Strive for Awesomeness 10.08.2018 19:21

Я пытался работать со строкой ниже, чтобы получить отображаемое имя, но я не могу его понять. Я получаю сообщение об ошибке. Не удается распознать фильтр поиска. $ UserDN = (Get-ADUser -Filter "employeeID -eq "$ID" ")

Strive for Awesomeness 10.08.2018 19:51

Похоже, что одно из ваших полей - $ null. Думаю, вы также можете попробовать добавить результаты этого $PSVersionTable;get-module -all | ?{$_.name -eq 'Microsoft.ActiveDirectory.Management'} | select name,version к своему вопросу, возможно, вы используете старую версию или что-то в этом роде, если вы уверены, что оба этих поля совпадают.

Jacob Colvin 10.08.2018 20:11

Хорошие моменты, но $logdate.ADEnabled-Disabled.csv без включения "..."перерывы вызова Export-Csv. Кроме того, гораздо эффективнее просто собрать весь вывод оператора foreach в $x (а не «добавлять» к массиву постепенно, который воссоздает его на каждой итерации), аналогично следующему примеру: $x = foreach ($num in 1..3) { $num * 2 }. Чтобы не хранить всю коллекцию в памяти, используйте Import-Csv | ForEach-Object ... | Export-Csv.

mklement0 10.08.2018 21:04

Я понял, что displayName втягивается как $ Null, поэтому я заменил его на GivenName и SurName, я все еще не мог заставить Export-CSV работать, но мне удалось заставить работать команду Out-File, поэтому я просто сделал это таким образом . Я могу использовать Excel, чтобы сделать его CSV. В моем файле импорта есть строки, которых нет в AD, поэтому я сделал оператор IF, чтобы разделить их. Я продолжу практиковаться и, надеюсь, смогу понять, как правильно собрать весь вывод оператора foreach в $x.

Strive for Awesomeness 10.08.2018 21:32

Проверьте мою правку и комментарий @ mklement0. Export-csv, вероятно, не работает, потому что у вас нет кавычек для определения $ var.x как $ var + string, а не свойства $ var +.

Jacob Colvin 10.08.2018 21:34

Когда я использую $result = @() ForEach ($User In $Users) { $result += [pscustomobject]@{, я недостаточно хорошо разбираюсь в сценарии. Он перестает читать данные из моего файла import-csv. Итак, я получаю «Фильтр поиска не может быть распознан», но когда я комментирую это, он снова работает. Я уверен, что это то, что я делаю с синтаксисом, когда играю с ним. Придется еще посмотреть завтра, спасибо за все.

Strive for Awesomeness 10.08.2018 21:46

нулевая строка в CSV-файле?

Jacob Colvin 10.08.2018 21:52
Ответ принят как подходящий

Со всеми этими комментариями и уже предоставленным неполным ответом, я боюсь, что OP еще больше запутается ...

Чтобы ОП лучше понимал, я по возможности придерживался его исходного кода.

Первый:

Глядя на код, я предполагаю, что входной CSV-файл похож на этот

"FirstName","LastName","Employee"
"Elvis","Presley","12345"
"Axl","Rose","987654"
"Janis","Joplin","654283"

Основная проблема, которую я здесь вижу, заключается в том, что код выполняет поиск пользователя AD с использованием свойства (строки) EmployeeID. При использовании фильтра как eq строка, найденная в AD, должна быть точно такой же, как в csv (хотя регистр не учитывается). Если это не так, код не найдет пользователя с помощью -eq, но, возможно, сравнив содержимое CSV и AD, можно использовать другой оператор, например -like. Это для ОП, чтобы выяснить.

Далее код:

#Script Starts
$Users = Import-Csv "\folder\Test.csv"

Import-Module ActiveDirectory
$path = Split-Path -parent ".\folder\*.*"

# Create log date
$logdate = Get-Date -Format yyyy-MM-dd-THH.mm.ss
$logfile = $path + "\logs\$logdate.logfile.txt"
# while you're at it, create the full path and filename for the output csv
$outFile = Join-Path $path $($logdate + ".ADEnabled-Disabled.csv")

# create an array for the output file
# You CAN do without by letting PowerShell do the aggregating of objects for you
# but in this case I think it will make things more readable to collect ourselves.
$result = @()
ForEach ($User In $Users) {
    # Find the user by the 'Employee' field in the csv and return an object with the required properties
    # Use -LDAPFilter which requires the LDAP syntax: "(employeeID=$($User.Employee))"
    # Or use -Filter where you use the Powershell syntax
    $adUser = Get-ADUser -Filter "EmployeeID -eq $($User.Employee)" -Properties DisplayName, Enabled, EmployeeID |
              Select-Object DisplayName, Enabled, EmployeeID

    if ($adUser) {
        # if the above statement did find the user, we add this to the result array
        $result += $adUser
    }
    else {
        $msg = "User '{0} {1}' not found. Check the Employee id {2}." -f $user.FirstName, $user.LastName, $user.Employee
        Write-Warning $msg
        Add-content $logfile -Value $msg
    }
} 

# now write the output csv as a new file. Because it has a complete date and time in the name
# the chances of overwriting an existing file are very slim indeed, but we'll use -Force anyway.
$result | Export-Csv -Path $outFile -NoTypeInformation -Force
#Finish

Надеюсь это поможет

Спасибо, этот код отличный, но, пожалуйста, потерпите меня, насколько я понимаю. $result = @() запускает массив, который хранит данные в памяти и является предпочтительным / эффективным способом сравнения / поиска csv. ForEach ($User in $Users) - это цикл, который содержит каждую строку ($ User) в csv ($ Users). -Filter использует столбец Employee в csv для поиска атрибута EmployeeID и извлекает только 3 свойства, но оператор Select-Object помещает эти 3 свойства в переменная $adUser. Если обнаружено, поместите свойства в массив «Остальное предупреждение». Когда закончите, создайте CSV.

Strive for Awesomeness 13.08.2018 16:06

Вы на месте!

Theo 13.08.2018 16:41

Большое спасибо. Я разберусь с этой штукой с PowerShell (надеюсь, раньше, чем позже): D Я благодарен всем за помощь в этом.

Strive for Awesomeness 13.08.2018 16:45

Другие вопросы по теме