Перейти к содержимому
www.mytechnote.ru
Меню
  • Администрирование
    • Скрипты
  • Оборудование
    • Обзоры
    • Инструкции
  • Прочее
  • Русский
    • English
    • Русский
Меню

Добавление пользователей в Active Directory из CSV файла при помощи скрипта PowerShell

Всем привет. Сегодня я покажу вам как можно автоматизировать добавление пользователей в AcriveDirecotory при помощи скрипта. Данные о пользователе будем брать из CSV файла.

Скачать архив со скриптом можно здесь. В этот же архив я положил установщик .net 4.5 и powershell 5.1 для 2008R2.

Пример моего файла CSV:

ФИО;должность;отдел;номер комнаты;номер телефона;электронная почта;идентификатор
Иванов Иван Иванович;директор;76;345;123;ivanov@mail.ru;00000001
Петрова Ирина Петровна;лаборант;77;367;124;petrova@mail.ru;00000002
Васильев Василий Васильевич;управляющий;78;389;125;vasiliev@mail.ru;00000003
Александров Александ Александрович;зам. Директора;79;411;126;aleksandrov@mail.ru;00000004
Сергеев Сергеей Сергеевич;лаборант;80;433;127;sergeev@mail.ru;00000005

Соответственно все поля мы будем заносить в AD. ФИО будет разбиваться на фамилию, имя и отчество. Имя пользователя у нас будет формироваться из первой буквы имени и фамилии, переведенных в транслит.

В случае, если имя пользователя уже существует — мы берем 2 буквы из имени и так далее.

Обратите внимание на поле идентификатор. Он как раз нужен для того, чтобы определить добавлять нового пользователя или редактировать существующего, если появляется однофамилец.

В случае появления записи с существующим идентификатором — данные о пользователе обновляются.

Так же при запуске нашего скрипта с ключом -del — пользователи, которые присутствуют в CSV файле будут удалены из AD.

Я тестировал работу скрипта на Windows 2008R2 с установленным powershell 5.1, т. е. он должен так же работать и на 2012 и на 2016 виндах.

Для того что бы установить PowerShell 5.1 на 2008R2 — на ней должен быть установлен как минимум первый service pack. А также .net 4.5. (установщик .net и powershell я добавил в архив со скриптом. Скачать SP1 для Windows 2008R2 можно по ссылке).

Для того что бы powershell дал запусткать скрипт нужно выполнить команду от имени администратора:

Set-ExecutionPolicy bypass

Обратите внимание на переменные в начале скрипта, в них задается путь и имя файла csv, пароль, который будет назначаться пользователям, а так же название домена.

Текст скрипта:

#Написано для сайта https://www.mytechnote.ru
#Для работы скрипта нужно обновить powershell, для этого
#сперва нужно установить sp1 (https://www.microsoft.com/ru-ru/download/details.aspx?id=5842)
#на сервер, если еще не установлен.
#Далее .net 4.5 (dotNetFX45_Full_setup)
#После чего нужно обновить powershell до версии 5.1 (в powershell запущенном от имени администратора выполняеем Set-ExecutionPolicy bypass, и запускаем скрипт установки из архива powershell51.zip)
#при запуске скрипта poweshell длжен быть запущен от имени администратора
#при запуске без ключа, будут добаляться и обновляться пользователи
#при запуске с ключом -del будут удалться пользователи
####################################################################################################################################################################################################

import-module activedirectory
#переменные:
#путь до CSV файла
$pathToCSV=".\f_151592b94af8a58e.csv"
#пароль который будет задан новым пользователям
$defpass="As12345^"
#указываем наш домен
$domain="@test.loc"


#функция транслитерации
function global:Translit {
    param([string]$inString)
    $Translit = @{
    [char]'а' = "a"
    [char]'А' = "a"
    [char]'б' = "b"
    [char]'Б' = "b"
    [char]'в' = "v"
    [char]'В' = "v"
    [char]'г' = "g"
    [char]'Г' = "g"
    [char]'д' = "d"
    [char]'Д' = "d"
    [char]'е' = "e"
    [char]'Е' = "e"
    [char]'ё' = "yo"
    [char]'Ё' = "eo"
    [char]'ж' = "zh"
    [char]'Ж' = "zh"
    [char]'з' = "z"
    [char]'З' = "z"
    [char]'и' = "i"
    [char]'И' = "i"
    [char]'й' = "j"
    [char]'Й' = "j"
    [char]'к' = "k"
    [char]'К' = "k"
    [char]'л' = "l"
    [char]'Л' = "l"
    [char]'м' = "m"
    [char]'М' = "m"
    [char]'н' = "n"
    [char]'Н' = "n"
    [char]'о' = "o"
    [char]'О' = "o"
    [char]'п' = "p"
    [char]'П' = "p"
    [char]'р' = "r"
    [char]'Р' = "r"
    [char]'с' = "s"
    [char]'С' = "s"
    [char]'т' = "t"
    [char]'Т' = "t"
    [char]'у' = "u"
    [char]'У' = "u"
    [char]'ф' = "f"
    [char]'Ф' = "f"
    [char]'х' = "h"
    [char]'Х' = "h"
    [char]'ц' = "ts"
    [char]'Ц' = "ts"
    [char]'ч' = "ch"
    [char]'Ч' = "ch"
    [char]'ш' = "sh"
    [char]'Ш' = "sh"
    [char]'щ' = "sch"
    [char]'Щ' = "sch"
    [char]'ъ' = ""
    [char]'Ъ' = ""
    [char]'ы' = "y"
    [char]'Ы' = "y"
    [char]'ь' = ""
    [char]'Ь' = ""
    [char]'э' = "e"
    [char]'Э' = "e"
    [char]'ю' = "yu"
    [char]'Ю' = "yu"
    [char]'я' = "ya"
    [char]'Я' = "ya"
    }
    $outCHR=""
    foreach ($CHR in $inCHR = $inString.ToCharArray())
        {
        if ($Translit[$CHR] -cne $Null )
            {$outCHR += $Translit[$CHR]}
        else
            {$outCHR += $CHR}
        }
    Write-Output $outCHR}

#импортируем csv файл в переменную
$csv=import-Csv $pathToCSV -Encoding OEM -Delimiter ';'
#разбираем переменную
foreach ($user in $csv)
    {
        #заносим в переменные значения из csv файла
        $fio="$($user.ФИО)"
        $surname=$fio.split(' ')[0]
        $name=$fio.split(' ')[1]
        $sname=$fio.split(' ')[2]
        $dolzhnost="$($user.должность)"
        $depart="$($user.отдел)"
        $room="$($user.'номер комнаты')"
        $phone="$($user.'номер телефона')"
        $mail="$($user.'электронная почта')"
        $id=$($user.'идентификатор')
        #переводим в транслит имя и фамилию
        $transName=Translit($name)
        $transSurname=Translit($surname)
        #отчищаем первые буквы имени
        $shortName=""
        #добаляем буквы к переменной shortname (переменная для создания логина)
        for ($i=1; $i -lt $transName.length; $i++)
        {
            #в зависимости от числа проходов цикла, добавляем i букв
            $shortName=$transName.substring(0,$i)
            #добавляем буквы имени к фамилии
            $userName=$shortName+$transSurname
            try
            {
                #проеряем, есть ли пользователь
                $user=Get-ADUser "$userName"
            }
            catch
            {
                $user=$false
            }
            #если пользователь существует
            if ($user)
            {
                #получаем id из AD
                $IDinAD=Get-ADUser $userName -Properties comment | select comment | ft -HideTableHeaders | out-string
                #если номер страхового из AD совпал с номером из csv
                if ($IDinAD -match $id)
                {
                    #если запутили скрипт без аргументов
                    if ($args[0] -eq "" -or !$args[0] )
                    {
                        #обновляем данные пользователя
                        Set-ADUser -Identity "$userName" -Surname "$surname" -DisplayName "$surname $name $sname" `
                        -OfficePhone "$phone" -EmailAddress "$mail" -Department "$depart" -Title "$dolzhnost" `
                        -UserPrincipalName "$userName$domain" -GivenName "$name" -Office "$room" -enabled $true -SamAccountName "$userName"
                        #прерываем цикл
                        break
                    }
                    #если запустили скрипт с аргументом -del
                    if ($args[0] -eq "-del")
                    {
                        #удаляем пользователя
                         Remove-ADUser -Identity $userName -Confirm:$false
                    }
                }
                #если id не совпадают, и найдено имя пользователя, идем к следующему шагу цикла
                else
                {
                    
                }
            }
            #если пользователя не существует
            else
            {
                #и запустили без аргументов
                if ($args[0] -eq "" -or !$args[0])
                {
                    try
                    {
                        $users=get-aduser -Filter "*" -Properties comment | select comment, name
                    }
                    catch
                    {
                        $users=$false
                    }
                    if ($users)
                    {
                        foreach ($user in $users)
                        {
                            #если у какого то пользователя есть id из csv, обновляем его
                            if ($user.comment -match $id)
                            {
                                $uname=$user.name.toString()
                                $distName=Get-ADObject -Filter 'name -eq $uname'
                                Set-ADUser -Identity "$uname" -Surname "$surname" -DisplayName "$surname $name $sname" `
                                -OfficePhone "$phone" -EmailAddress "$mail" -Department "$depart" -Title "$dolzhnost" `
                                -UserPrincipalName "$userName$domain" -GivenName "$name" -Office "$room" -enabled $true `
                                -SamAccountName "$userName"
                                Rename-ADObject $distName.DistinguishedName -NewName $userName
                            }
                        }
                    }
                        try
                        {
                        #добавляем пользователя и прерываем цикл
                        New-ADUser -Name "$userName" -Surname "$surname" -DisplayName "$surname $name $sname" `
                        -OfficePhone "$phone" -EmailAddress "$mail" -Department "$depart" -Title "$dolzhnost" `
                        -UserPrincipalName "$userName$domain" -GivenName "$name" -Office "$room" -OtherAttributes @{comment="$id"} `
                        -AccountPassword (ConvertTo-SecureString -AsPlainText "$defpass" -force) -enabled $true `
                        -ChangePasswordAtLogon $true -SamAccountName "$userName" -erroraction 'silentlycontinue'
                        }
                        catch
                        {
                        }
                        break
                }
            }
        }
    }
Опубликовано в 01.06.201730.05.2024 от sanglyb

Навигация по записям

← Базовая настройка Mikrotik
Терминальный сервер на Windows 10, разрешаем множественные подключения по RDP →

19 комментариев для “Добавление пользователей в Active Directory из CSV файла при помощи скрипта PowerShell”

  1. Максим:
    26.07.2018 в 06:12

    Александр, спасибо большое за

    Александр, спасибо большое за скрипт, отрабатывает на w2016! Но возник вопрос: Если некоторые поля в файле csv не заполнены, например Отдел или телефон или еще какое-то, то скрипт не отрабатывает. Как его дополнить, чтобы он игнорировал не заполненные поля?

    Cпасибо.

    Ответить
    1. sanglyb:
      27.07.2018 в 07:13

      Думаю, можно добавить

      Думаю, можно добавить проверки на существования полей, и если то или иное поле окажется $null — давать ему какое-нибудь значение.

      Например за место $dolzhnost="$($user.должность)" можно сделать

      if ($user.должность -ne $null)

      {

      $dolsznost=»$($user.должность)»

      }

      else

      {

      $dolszhnost=’что-нибдь, ну или пробел’

      }

      Ответить
      1. Shuhrat:
        04.12.2018 в 12:32

        Извините, а где именно

        Извините, а где именно прописать этот код?

        Ответить
  2. Shuhrat Rahmanberdiyev:
    20.09.2018 в 13:42

    Здравствуйте, подскажите

    Здравствуйте, подскажите пожалуйста в чем проблема, спасибо
    Import-Csv : Не удается найти параметр, соответствующий имени параметра "Encodi
    ng".
    C:aduserstoAD.ps1:104 знак:37
    + $csv=import-Csv $pathToCSV -Encoding <<<<  OEM -Delimiter ';'
        + CategoryInfo          : InvalidArgument: (:) [Import-Csv], ParameterBind
       ingException
        + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Comm
       ands.ImportCsvCommand
    Ответить
    1. sanglyb:
      20.09.2018 в 18:15

      Судя по всему — не обновлен
      Судя по всему — не обновлен wmf (powershell).

      Ответить
  3. Shuhrat Rahmanberdiyev:
    21.09.2018 в 03:27

    Но я сделал все по инструкции

    Но я сделал все по инструкции, сначала установил нетфрейм, потом повершел ,сервер перезагрузился , установил сам компоненты, снова перезагрузился, но версия не изменился стоит V2, как быть? никакой ощибки при установке не было

    Ответить
  4. Shuhrat Rahmanberdiyev:
    21.09.2018 в 03:58

      Все спасибо, получилось,

      Все спасибо, получилось, действительно проблема была в версии ПШ. он не устанавливался потому что Фреймворк не обновился, скачал и установил с https://download.microsoft.com/download/1/6/7/167F0D79-9317-48AE-AEDB-17120579F8E2/NDP451-KB2858728-x86-x64-AllOS-ENU.exe&nbsp;

    и все заработал.

    СПАСИБО АВТОРУ!!!!

    Ответить
  5. Shuhrat Rahmanberdiyev:
    21.09.2018 в 04:12

    Еще один вопрос, а можноли

    Еще один вопрос, а можноли добавить в этот же скрипт команду с паролями?

    Ответить
    1. sanglyb:
      21.09.2018 в 07:52

      что вы имеете ввиду под

      что вы имеете ввиду под командой с паролями?

      Ответить
      1. Shuhrat Rahmanberdiyev:
        26.09.2018 в 09:55

        с паролями я уже решил с

        с паролями я уже решил с параметрами 

        -AccountPassword (ConvertTo-SecureString -AsPlainText "$room" -force) -enabled $true 

        вот беда в другом, при обновлении юзеров у меня выскакивает ошибка :

        Set-ADUser : replace At C:ADuser5.ps1:161 char:7 + … Set-ADUser -Identity "$userName" -Surname "$surname" -Dis … + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (ShmidtSI:ADUser) [Set-ADUser], ADInvalidOperationException + FullyQualifiedErrorId : replace,Microsoft.ActiveDirectory.Management.Commands.SetADUser

        помагите пожалуйста

        Ответить
  6. Shuhrat Rahmanberdiyev:
    26.09.2018 в 09:57

    и при добавление в код

    и при добавление в код параметр -Manager , все пользователи удаляются или же не добавляются

    Ответить
  7. Shuhrat:
    04.12.2018 в 05:53

    Здравствуйте,  При запуске

    Здравствуйте, 
     
    При запуске скрипта выходет следующая ошибка, подскажите пожалуйста в чем причина?
    PS C:> .aduserstoad2
    Set-ADUser : Указанная учетная запись уже существует
    At C:aduserstoAD2.ps1:194 char:9
    + …             Set-ADUser -Identity "$uname" -Surname "$surname" -Displa …
    +                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ResourceExists: (TMamitova:ADUser) [Set-ADUser], ADIdentityAlreadyExistsException
        + FullyQualifiedErrorId : Указанная учетная запись уже существует,Microsoft.ActiveDirectory.Management.Commands.Se
       tADUser
     
    Rename-ADObject : Сделана попытка добавить к каталогу объект с уже существующим именем
    At C:aduserstoAD2.ps1:198 char:9
    + …             Rename-ADObject $distName.DistinguishedName -NewName $use …
    +                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (CN=TMamitova,CN…stdomain,DC=han:ADObject) [Rename-ADObject], ADExceptio
       n
        + FullyQualifiedErrorId : Сделана попытка добавить к каталогу объект с уже существующим именем,Microsoft.ActiveDir
       ectory.Management.Commands.RenameADObject
     

     

    Ответить
  8. Shuhrat:
    04.12.2018 в 06:13

    Причина выявлена, проблема в

    Причина выявлена, проблема в том что все поля не должны быть пустыми что и связан с вопросом максима, спасибо всем

    Ответить
  9. Dmitry:
    13.05.2019 в 14:46

    Здравствуйте, а как добавить

    Здравствуйте, а как добавить точку после первой буквы имени в логине?

    Ответить
  10. Dmitry:
    13.05.2019 в 14:56

    Здравствуйте, подскажите

    Здравствуйте, подскажите пожалуйста, как поставить точку после первой буквы имени в логине?

    Ответить
    1. DINUR:
      22.07.2020 в 16:44

      чтобы ставить точку после имя

      чтобы ставить точку после имя нужно изменить здесь $userName=$shortName+$transSurname на $userName=$shortName+'.'+$transSurname то тогда получется из Иванов Динур Сергеевича D.Ivanov@domain 

      Ответить
  11. virusoknv:
    29.04.2021 в 11:26

    Добрый день, надеюсь пост еще

    Добрый день, надеюсь пост еще читается. Подскажите а как можно сделать, чтобы логин формилровался как первая буква имени + первая буква отчетсва + фамилия. И возможно ли, чтобы пользователь прописывался в консоле на русском? https://skr.sh/s7oqklOTWV1?a&nbsp;

    Ответить
    1. DINUR:
      07.08.2021 в 10:57

      Здравствуйте, пойже буду за
      Здравствуйте, пойже буду за компом там готовый шаблон я сделал там все капрызы я испонил.
      Для себя сделал так:
      Султанбаев Динур Иванов
      учетку создает
      dilnur.sultanbayev@domain.com
      отображение имя(Display name):
      Dilnur I. Sultanbayev
      автоматический в подразделении по отделам по требованию статусам отключённой или включенный.
      там все мелочи я устрянял…
      вечером буду за компом готовый csv и скрипт отправлю

      Ответить
  12. sanglyb:
    07.08.2021 в 10:45

    параметр -name отвечает за

    параметр -name отвечает за имя, которое отображается в оснастке (вроде бы).

    New-ADUser -Name «Иванов Иван Иванович» …

    Касательно формирования — sname нужно использовать по сути также, как используется name в скрипте.

     

    Ответить

Добавить комментарий Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Подписывайтесь

Youtube
vk
telegram
github
twitter
rss
  • Форум
  • Об авторе
  • Поддержать автора

Популярные записи

Новые записи

  • Как расширить LVM раздел в Linux
  • Исправление ошибки SrsResources.dll после обновления SSRS для SCCM
  • Проблема при использовании библиотеки PassFiltEx на старых процессорах
  • Как удалить вложения из старых событий календаря в Exchange с помощью скрипта
  • Как скачать и установить Office 2024 LTSC

Архивы

  • 2026 (3)
  • 2025 (5)
  • 2024 (7)
  • 2023 (6)
  • 2022 (5)
  • 2021 (25)
  • 2020 (34)
  • 2019 (39)
  • 2018 (78)
  • 2017 (56)
  • 2016 (77)
  • 2015 (9)
© 2015-2026 www.mytechnote.ru
Использование материалов сайта возможно только с разрешения владельца или обязательна индексируемая, прямая, передающая вес ссылка на материал.