DOC / 1461 SysAdminHub.ru

Как импортировать пользователей AD из CSV с помощью PowerShell

Как импортировать пользователей AD из CSV с помощью PowerShell

Как работает импорт пользователей Active Directory из CSV

Принцип достаточно простой: данные пользователей заранее заносятся в CSV-файл, после чего PowerShell последовательно читает каждую строку и создаёт соответствующую учётную запись с помощью командлета New-ADUser.

В нашем примере для пользователя можно задать:

  • имя;
  • фамилию;
  • отображаемое имя;
  • логин пользователя;
  • User Principal Name (UPN);
  • улицу;
  • город;
  • регион;
  • почтовый индекс;
  • страну;
  • должность;
  • отдел;
  • компанию;
  • руководителя;
  • организационную единицу (OU);
  • описание;
  • офис;
  • номер телефона;
  • электронную почту;
  • мобильный телефон;
  • заметки;
  • состояние учётной записи.

Готовый пример CSV-файла можно скачать здесь: ImportADUsers.csv.

Подготавливаем CSV-файл с пользователями

Если вы ранее экспортировали пользователей Active Directory с помощью нашего PowerShell-скрипта, можно использовать полученный CSV-файл как основу.

Инструкция по экспорту находится здесь: Экспорт пользователей AD в CSV с помощью PowerShell.

Если готового Active Directory нет, скачайте пример ImportADUsers.csv и заполните его своими данными.

CSV-файл для импорта пользователей в Active Directory

Заголовки столбцов CSV должны соответствовать тем, которые используются PowerShell-скриптом:

First name
Last name
Display name
User logon name
User principal name
Street
City
State/province
Zip/Postal Code
Country/region
Job Title
Department
Company
Manager
OU
Description
Office
Telephone number
E-mail
Mobile
Notes
Account status

Проверяем OU перед импортом

В столбце OU необходимо указывать полный Distinguished Name организационной единицы, в которой должна быть создана учётная запись.

Например:

OU=Sales,OU=Users,OU=Company,DC=exoip,DC=local

Получить список OU и их Distinguished Name можно через PowerShell:

Get-ADOrganizationalUnit -Filter * |
    Select-Object Name,DistinguishedName |
    Sort-Object Name

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

Подготавливаем PowerShell-скрипт для импорта пользователей

Скачайте готовый скрипт Import-ADUsers.ps1 или создайте файл вручную.

Создайте каталог:

C:\scripts

Поместите CSV-файл и скрипт в эту папку:

C:\scripts\ImportADUsers.csv
C:\scripts\Import-ADUsers.ps1

PowerShell-скрипт для массового создания пользователей AD

Ниже приведён готовый вариант скрипта:

<#
    .SYNOPSIS
    Import-ADUsers.ps1

    .DESCRIPTION
    Import Active Directory users from CSV file.
#>

# Путь к CSV-файлу
$CsvFile = "C:\scripts\ImportADUsers.csv"

# Импорт модуля Active Directory
Import-Module ActiveDirectory

# Проверяем наличие CSV-файла
if (-not (Test-Path $CsvFile)) {
    Write-Error "CSV-файл не найден: $CsvFile"
    exit
}

# Запрашиваем пароль для новых пользователей
$Password = Read-Host "Введите временный пароль для новых пользователей" -AsSecureString

# Импортируем пользователей из CSV
$Users = Import-Csv $CsvFile

foreach ($User in $Users) {

    try {

        $SamAccountName = $User.'User logon name'

        # Проверяем, существует ли пользователь
        $ExistingUser = Get-ADUser `
            -Filter "SamAccountName -eq '$SamAccountName'" `
            -ErrorAction SilentlyContinue

        if ($ExistingUser) {
            Write-Warning "Пользователь $SamAccountName уже существует в Active Directory."
            continue
        }

        # Проверяем наличие OU
        try {
            Get-ADOrganizationalUnit `
                -Identity $User.'OU' `
                -ErrorAction Stop | Out-Null
        }
        catch {
            Write-Warning "OU не найдена для пользователя $SamAccountName : $($User.'OU')"
            continue
        }

        # Получаем DistinguishedName руководителя
        $ManagerDN = $null

        if (-not [string]::IsNullOrWhiteSpace($User.'Manager')) {

            $Manager = Get-ADUser `
                -Filter "DisplayName -eq '$($User.'Manager')'" `
                -Properties DisplayName `
                -ErrorAction SilentlyContinue

            if ($Manager -and @($Manager).Count -eq 1) {
                $ManagerDN = $Manager.DistinguishedName
            }
            elseif (@($Manager).Count -gt 1) {
                Write-Warning "Найдено несколько руководителей с именем '$($User.'Manager')'. Поле Manager для $SamAccountName будет пропущено."
            }
            else {
                Write-Warning "Руководитель '$($User.'Manager')' для $SamAccountName не найден."
            }
        }

        # Параметры нового пользователя
        $NewUserParams = @{
            Name                  = "$($User.'First name') $($User.'Last name')"
            GivenName             = $User.'First name'
            Surname               = $User.'Last name'
            DisplayName           = $User.'Display name'
            SamAccountName        = $SamAccountName
            UserPrincipalName     = $User.'User principal name'
            StreetAddress         = $User.'Street'
            City                  = $User.'City'
            State                 = $User.'State/province'
            PostalCode            = $User.'Zip/Postal Code'
            Country               = $User.'Country/region'
            Title                 = $User.'Job Title'
            Department            = $User.'Department'
            Company               = $User.'Company'
            Path                  = $User.'OU'
            Description           = $User.'Description'
            Office                = $User.'Office'
            OfficePhone           = $User.'Telephone number'
            EmailAddress          = $User.'E-mail'
            MobilePhone           = $User.'Mobile'
            AccountPassword       = $Password
            Enabled               = ($User.'Account status' -eq "Enabled")
            ChangePasswordAtLogon = $true
        }

        # Добавляем руководителя только если он найден однозначно
        if ($ManagerDN) {
            $NewUserParams.Manager = $ManagerDN
        }

        # Добавляем Notes, если поле заполнено
        if (-not [string]::IsNullOrWhiteSpace($User.'Notes')) {
            $NewUserParams.OtherAttributes = @{
                info = $User.'Notes'
            }
        }

        # Создаём пользователя
        New-ADUser @NewUserParams -ErrorAction Stop

        Write-Host "Пользователь $SamAccountName успешно создан." -ForegroundColor Green
    }
    catch {
        Write-Host "Ошибка создания пользователя $SamAccountName : $($_.Exception.Message)" -ForegroundColor Red
    }
}

Почему лучше не хранить пароль в PowerShell-скрипте

В простых примерах массового создания пользователей часто встречается конструкция:

$Password = "P@ssw0rd1234"

а затем:

ConvertTo-SecureString $Password -AsPlainText -Force

Для тестовой лаборатории это может быть удобно, но в рабочей инфраструктуре такой подход нежелателен: любой пользователь с доступом к файлу .ps1 увидит пароль новых учётных записей.

Поэтому в нашем варианте используется:

$Password = Read-Host "Введите временный пароль для новых пользователей" -AsSecureString

После создания пользователя параметр:

ChangePasswordAtLogon = $true

потребует сменить временный пароль при следующем входе.

Как скрипт обрабатывает существующих пользователей

Перед созданием каждой учётной записи скрипт проверяет SamAccountName:

$ExistingUser = Get-ADUser `
    -Filter "SamAccountName -eq '$SamAccountName'" `
    -ErrorAction SilentlyContinue

Если пользователь уже существует, новая учётная запись не создаётся:

ПРЕДУПРЕЖДЕНИЕ: Пользователь Kylie.Davidson уже существует в Active Directory.

Это позволяет повторно запустить импорт и не пытаться заново создавать уже существующие учётные записи.

Как назначается руководитель пользователя

В CSV руководитель указывается в столбце Manager. Скрипт ищет соответствующего пользователя Active Directory по DisplayName и получает его Distinguished Name.

После этого значение передаётся параметру:

Manager = $ManagerDN

Если руководитель не найден, пользователь всё равно будет создан, но поле Manager останется пустым.

Запускаем импорт пользователей Active Directory

Откройте PowerShell под учётной записью, имеющей права на создание пользователей в целевых OU.

Перейдите в каталог:

cd C:\scripts

Запустите скрипт:

.\Import-ADUsers.ps1

PowerShell запросит временный пароль:

Введите временный пароль для новых пользователей: ************

После этого начнётся обработка CSV-файла.

Во время выполнения скрипт будет сообщать результат для каждой учётной записи:

WARNING: Пользователь Kylie.Davidson уже существует в Active Directory.
WARNING: Пользователь Leonard.Clark уже существует в Active Directory.
Пользователь Sebastian.Nolan успешно создан.
Пользователь Zoe.Roberts успешно создан.

Проверяем созданных пользователей

После завершения импорта откройте Active Directory Users and Computers и перейдите в организационные единицы, указанные в CSV.

Пользователи, импортированные из CSV в Active Directory

Проверьте несколько созданных учётных записей вручную:

  • имя и фамилию;
  • SamAccountName;
  • UPN;
  • организационную единицу;
  • отдел и должность;
  • телефон и электронную почту;
  • руководителя;
  • состояние учётной записи.

Также можно проверить созданных пользователей через PowerShell:

Get-ADUser -Filter * `
    -SearchBase "OU=Users,OU=Company,DC=exoip,DC=local" `
    -Properties Department,Title,Manager,Mail |
    Select-Object Name,SamAccountName,Enabled,Department,Title,Mail

Часто задаваемые вопросы

Как массово создать пользователей Active Directory?

Подготовьте CSV-файл с данными пользователей и используйте PowerShell-командлет New-ADUser. Скрипт из статьи автоматически читает CSV, проверяет существующие учётные записи и создаёт новых пользователей в указанных OU.

Нужно ли запускать скрипт на контроллере домена?

Нет. Скрипт можно выполнить с административной рабочей станции, если установлен модуль ActiveDirectory, есть доступ к домену и учётная запись имеет необходимые права на создание пользователей.

Что произойдёт, если пользователь уже существует?

Скрипт проверяет SamAccountName перед созданием учётной записи. Если такой пользователь уже существует, он будет пропущен.

Можно ли создать пользователей сразу в разных OU?

Да. Для каждого пользователя в столбце OU CSV-файла можно указать свой Distinguished Name организационной единицы.

Можно ли использовать один временный пароль для всех пользователей?

Технически да. В приведённом варианте пароль вводится один раз перед запуском импорта и применяется к создаваемым учётным записям. При этом пользователю назначается смена пароля при следующем входе.

Почему пароль не указан прямо в скрипте?

Хранение рабочего пароля открытым текстом внутри .ps1 создаёт ненужный риск. Поэтому скрипт запрашивает временный пароль при запуске через Read-Host -AsSecureString.

Можно ли использовать CSV из статьи об экспорте пользователей AD?

Да. Формат можно использовать как основу для обратного импорта. Перед запуском обязательно проверьте значения OU, логины, UPN и остальные данные пользователей.

Заключение

PowerShell позволяет значительно ускорить массовое создание пользователей Active Directory. Вместо ручного создания каждой учётной записи достаточно подготовить CSV-файл, проверить данные и запустить скрипт.

В нашем варианте скрипт проверяет существующих пользователей и целевые OU, создаёт учётные записи с необходимыми атрибутами, назначает руководителя и требует сменить временный пароль при первом входе.

Перед массовым запуском обязательно протестируйте импорт на нескольких учётных записях. Это позволит проверить структуру CSV, права, OU и корректность заполнения атрибутов до создания большого количества пользователей.

Если сначала необходимо получить данные существующих учётных записей, смотрите инструкцию Экспорт пользователей AD в CSV с помощью PowerShell.

ORIGINAL / ATTRIBUTION

Источник материала

Материал взят с https://sysadminhub.ru/. Оригинальная статья и авторство указаны по ссылке ниже.

Оригинал статьи на SysAdminHub.ru ↗

https://sysadminhub.ru/produkty-microsoft/windows-server/import-ad-users-from-csv-powershell

Материал проверен 10.10.2026. При изменении программного обеспечения сверяйтесь с актуальной документацией.
← Вернуться в базу знаний