Для чтения содержимого CSV файла можно использовать PowerShell командлет Import-CSV. После загрузки содержимого CSV файла, вы получаете объект PowerShell, в котором каждая колонка из CSV файла представляет собой отдельное свойство. В этой статье мы рассмотрим особенности использования командлета Import-CSV для чтения данных из CSV.
CSV файл представляет собой форму табличного представления данных. Итак, мы создали в Excel простейшую таблицы с данными пользователей в AD со следующей структурой:
ADlogin, Email, Phone, Department
. Обратите внимание, что в первой строке таблицы указаны названия столбцов. В PowerShell эти названия будут доступны, как атрибуты объектов в массиве.
Наша задача – импортировать данный CSV файл в PowerShell и внести изменения в Active Directory для каждого логина пользователя из файла.
Сохраните данный Excel файл как CSV файл с запятыми в качестве разделителей. Получится вот такой текстовый файл:
Для импорта CSV файла в PowerShell достаточно указать его имя (путь)
$ADUsers=Import-CSV -path C:\PS\my_ad_users.csv
Командлет Import-CSV конвертирует данные из CSV файла в массив PowerShell.
$ADUsers=Import-CSV -path C:\PS\my_ad_users.csv -Delimiter ";"
Если в качестве распределите в CSV используется символ табуляции, нужно указать его так:
-Delimeter `t
Если вы хотите использовать разделить в вашей системе по умолчанию (зависит от языка и региональных настроек Windows), нужно использовать параметр
-UseCulture
.
Разделитель по-умолчанию в Windows можно получить с помощью команды:
(Get-Culture).TextInfo.ListSeparator
Теперь если вызвать переменную
$ADUsers
, вы выведете содержимое вашего CSV файла. Командлет преобразовал содержимое файла в массив, а все значения из CSV файла были конвертированы в строки.
Import-CSV -path C:\PS\my_ad_users.csv -Encoding UTF8
Список доступны свойств объекта можно вывести так:
$ADUsers|get-member
Как вы видите, в строках массива содержатся объекты типа PSCustomObject, к элементам которых можно обращаться по названия столбцов из вашего CSV файла.
Можно вывести все значения из определенного столбца:
$ADusers.email
Или вы можете вывести только определенные свойства объектов:
$ADusers| select Email, Phone
Можно обратится напрямую к определенной строке в массиве. Чтобы получить значение 3 строки, выполните команду (нумерация начинается с 0):
$ADusers[2]
Чтобы внести изменения в атрибуты пользователей Active Directory, которые вы задали в вашем CSV файле нужно с помощью цикла ForEach перебрать все строки в массиве $ADUsers ( для внесения изменений мы используем командлет Set-ADUser из модуля AD PowerShell).
#перебор всех строк в массиве по одному
$ADUsers | ForEach-Object {
# В данном примере строка $_. означает, что мы обращаемся к текущей строке массива. Значение конкретного столбца из текущей строки можно получить, обратившись к нему по имени столбца. Например, чтобы вывести на экран значение ADLogin из текущей строки:
Write-host $_.AdLogin
# Ищем пользователя в AD по значению из столбца ADLogin и меняем значения в его атрибутах из оставшихся столбцов.
Set-ADUser -Identity $_.AdLogin -MobilePhone $_.Phone –Department $_.Department –EmailAddress $_.Email
}
Этот же скрипт можно представить в более компактном виде однострочника PowerShell:
Import-Csv C:\PS\my_ad_users.csv | foreach {Set-ADUser -Identity $_.AdLogin -MobilePhone $_.Phone –Department $_.Department –EmailAddress $_.Email}
ForEach ($User in $ADUsers){
$samaccountname = $User.ADlogin
$email = $user.Email
Write-host $samaccountname
Write-host $email
}
В некоторых случаях при обработке элементов массива из CSV файла вам нужно добавить в массив дополнительный столбец. Например, вы хотите добавить в объект $ADUsers текущую дату:
$ADUsers | add-member -membertype NoteProperty -name Date -value (Get-Date -Format dd/MM/yyyy)
На сайте https://winitpro.ru/ описаны различные сценарии использования командлета Import-CSV для выполнения административных операций с большим количеством объектов:
- Экспорт содержимого ящиков Exchange в PST файлы по списку пользователей:
Import-CSV "C:\ps\user_to_export_pst.csv" | ForEach {New-MailboxExportRequest -Mailbox $_.username -FilePath $_.UNCPathtoPst
- Добавить пользователей в группу безопасности AD: I
mport-CSV .\users.csv -Header users | ForEach-Object {Add-AdGroupMember -Identity ‘TestADGroup’ -members $_.users}
- Выгрузить информацию о пользователях из AD:
Import-Csv c:\ps\usernsme_list.csv | ForEach {
Get-ADUser -identity $_.user -Properties Name, telephoneNumber |
Select Name, telephoneNumber |
Export-CSV c:\ps\export_ad_list.csv -Append -Encoding UTF8
}Или изменить атрибуты некоторых пользователей через Set-ADUser:
Import-Csv "C:\ps\modifyad_users.csv" | foreach {Set-ADUser -Identity $_.SamAccountName –Title $_.Title -MobilePhone $_.MobilePhone}
Обновить фотографию в AD по списку пользователей:
Import-Csv C:\PS\import.csv |%{Set-ADUser -Identity $_.AD_username -Replace @{thumbnailPhoto=([byte[]](Get-Content $_.Photo -Encoding byte))}}
- Массово создать учетных записи пользователей в Active Directory по списку из CSV файла.
Или аналогичный сценарий по добавлению пользователей в группу Azure AD:
Import-CSV "C:\PS\add_m365_members.csv" | ForEach-Object {
Add-UnifiedGroupLinks –Identity it_dept –LinkType Members –Links $_.member
}