Вы здесь

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


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

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

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

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

ФИО;должность;отдел;номер комнаты;номер телефона;электронная почта;идентификатор
Иванов Иван Иванович;директор;76;345;123;[email protected];00000001
Петрова Ирина Петровна;лаборант;77;367;124;[email protected];00000002
Васильев Василий Васильевич;управляющий;78;389;125;[email protected];00000003
Александров Александ Александрович;зам. Директора;79;411;126;[email protected];00000004
Сергеев Сергеей Сергеевич;лаборант;80;433;127;[email protected];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
                }
            }
        }
    }
0 2

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


Если вам помогла статья, вы можете >>отблагодарить автора<<


Комментарии

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

0 0

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

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

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

{

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

}

else

{

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

}

0 0

Здравствуйте, подскажите пожалуйста в чем проблема, спасибоImport-Csv : Не удается найти параметр, соответствующий имени параметра "Encoding".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

0 0

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

0 0

  Все спасибо, получилось, действительно проблема была в версии ПШ. он не устанавливался потому что Фреймворк не обновился, скачал и установил с ]]>https://download.microsoft.com/download/1/6/7/167F0D79-9317-48AE-AEDB-17...]]>и все заработал.СПАСИБО АВТОРУ!!!!

0 0

с паролями я уже решил с параметрами -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помагите пожалуйста

0 0

Здравствуйте,  При запуске скрипта выходет следующая ошибка, подскажите пожалуйста в чем причина?PS C:\> .\aduserstoad2Set-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  

0 0

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

0 0

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

New-ADUser -Name "Иванов Иван Иванович" ...

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

 

0 0

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

0 0