Создание пользователя в Active Directory, Exchange и Skype средствами PowerShell

Создание пользователя в Active Directory, Exchange и Skype средствами PowerShell

Создание пользователей одна из самых тривиальных задач системного администратора. И казалось бы в большинстве случаев нет необходимости что-то писать на PowerShell. Однако это не так. И вот таким простым скриптом можно существенно облегчить себе жизнь при создании любого количества пользователей.

По заголовку понятно, что предлагаемый скрипт создает пользователя в домене, затем создает ему почтовый ящик и учетную запись в Skype для бизнеса. Однако этим функционал не ограничивается. Скрипт так же генерирует для пользователя логин на основе его фамилии и первой буквы имени, генерирует сложный пароль (удовлетворяющий требованиям AD), работает с csv, а потому может создавать пакетно большое количество пользователей ну и в конце отправляет отчет в почту администратора.

Формат файла csv традиционный — разделенный запятыми. При желании вы можете переписать скрипт с использованием формы, мне вполне удобно и универсально показалось использовать именно csv формат. Скрипт необходимо запускать на контроллере домена, для подключения к серверам Exchange и Skype for Business скрипт запросит учетные данные перед запуском. Предполагается, что для обоих сервисов это одна учетная запись с правами администратора. Любые дополнения, комментарии и критика приветствуются. Все компоненты скрипта были собраны из разных источников в интернете, т.е. я не такой крутой программист как хотелось бы 😉

powershell скрипт автоматического добавления пользователей в домен с созданием почтового ящика и skype
Вид окна исполняемого скрипта добавления пользователей

Обновление 28.05.2019. Упрощен формат csv файла. Теперь достаточно ввести только ФИО, город, компанию, департамент, должность и телефон (в первой версии фамилия и имя вводились отдельно см. ссылку внизу статьи). Логин и прочие поля генерируются автоматически из ФИО. Так же добавлен флажок на отправку уведомления по электронной почте, который включен по умолчанию, но его можно отключить если нет необходимости в получении данных учетной записи по электронной почте.

Обновление 19.11.2019. Загрузил файлы проекта на github https://github.com/dkplayer/ad-csv-import Все дальнейшие изменения будут появляться там.

FIO,City,Company,Departament,Title,Phone
Add-Type -assembly System.Windows.Forms
$UserCredential = Get-Credential

function Get-RandomCharacters1($length, $characters) { 
    $random = 1..$length | ForEach-Object { Get-Random -Maximum $characters.length } 
    $private:ofs="" 
    return [String]$characters[$random]
}

#Параметры отправки почты
$EmailFrom = "it@example.com"
$EmailTo = "admin@example.com"
$Subject = "Новые пользователи"
$body = "Новые пользователи в домене example.com:      `n`n"

#Основные параметры
$UserList=IMPORT-CSV  -Encoding default users.csv
$Domain="@example.com"
$domain_short="example\"
# OU куда добавлять
$OU="OU=new,OU=direction,DC=example,DC=com"
#Параметры почтового сервера для отправки сообщения
$SmtpServer = “smtp.example.com”
$smtp_port=25

#Параметры Exchange
$exch_database="Mailbox Database 0360667435"
$exch_server="http://exchange.example.com/PowerShell/"

#Skype
$sip_domain="example.com"
$skype_server="https://skype.example.com/ocspowershell/"
$sip_pool="skype.example.com"





#Создание формы
$main_form = New-Object System.Windows.Forms.Form
$main_form.Text ='Import CSV Users'
$main_form.Width = 210
$main_form.Height = 100
$main_form.AutoSize = $tcome

$checkbox1 = new-object System.Windows.Forms.checkbox
$checkbox1.Location = new-object System.Drawing.Size(10,10)
$checkbox1.Size = new-object System.Drawing.Size(60,20)
$checkbox1.Text = "email"
$checkbox1.Checked = $false
$main_form.Controls.Add($checkbox1) 

$checkbox2 = new-object System.Windows.Forms.checkbox
$checkbox2.Location = new-object System.Drawing.Size(80,10)
$checkbox2.Size = new-object System.Drawing.Size(60,20)
$checkbox2.Text = "Skype"
$checkbox2.Checked = $false
$main_form.Controls.Add($checkbox2) 

$checkbox3 = new-object System.Windows.Forms.checkbox
$checkbox3.Location = new-object System.Drawing.Size(150,10)
$checkbox3.Size = new-object System.Drawing.Size(120,20)
$checkbox3.Text = "Уведомление"
$checkbox3.Checked = $tcome
$main_form.Controls.Add($checkbox3) 

function Translitcom2LAT ($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]'ё' = "e";[char]'Ё' = "e";
    [char]'ж' = "zh";[char]'Ж' = "zh";
    [char]'з' = "z";[char]'З' = "z";
    [char]'и' = "i";[char]'И' = "i";
    [char]'й' = "y";[char]'Й' = "y";
    [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]'х' = "kh";[char]'Х' = "kh";
    [char]'ц' = "ts";[char]'Ц' = "ts";
    [char]'ч' = "ch";[char]'Ч' = "ch";
    [char]'ш' = "sh";[char]'Ш' = "sh";
    [char]'щ' = "shch";[char]'Щ' = "shch";
    [char]'ъ' = "";[char]'Ъ' = "";
    [char]'ы' = "y";[char]'Ы' = "y";
    [char]'ь' = "";[char]'Ь' = "";
    [char]'э' = "e";[char]'Э' = "e";
    [char]'ю' = "yu";[char]'Ю' = "yu";
    [char]'я' = "ya";[char]'Я' = "ya"
    }
    $outChars = ""
    foreach ($c in $inChars = $inString.ToCharArray())
        {
        if ($Translit[$c] -cne $Null )
            {$outChars += $Translit[$c]}
        else
            {$outChars += $c}
        }

	Write-Output $outChars

 }
#

$i=1
#Задание массивов данных пользователей
#$Username=@()
$transname=@()
$FIO=@()
$FN=@()
$SN=@()
$City=@()
$Company=@()
$Departament=@()
$Title=@()
$Phone=@()
$old=@()
$Password=@()
$f_i_o=@()

FOREACH ($Person in $UserList) {
#$Username+=$Person.Username
$f_i_o=$Person.FIO.Split(" ")
$firstletter=$f_i_o[1][0]
$transname1=$firstletter+$f_i_o[0]
$transname+=Translitcom2LAT $transname1
$FIO+=$Person.FIO
$FN+=$f_i_o[1]
$SN+=$f_i_o[0]
$City+=$Person.City
$Company+=$Person.Company
$Departament+=$Person.Departament
$Title+=$Person.Title
$Phone+=$Person.Phone
$old+=$Person.uSERNAME
$tmppw1=Get-RandomCharacters1 -length 4 -characters 'abcdefghiklmnoprstuvwxyzABCDEFGHKLMNOPRSTUVWXYZ'
$tmppw2=Get-RandomCharacters1 -length 4 -characters '1234567890@&!'
$tmppw3=Get-RandomCharacters1 -length 4 -characters 'abcdefghiklmnoprstuvwxyzABCDEFGHKLMNOPRSTUVWXYZ'
$Password+=$tmppw1+$tmppw2+$tmppw3
$Label = New-Object System.Windows.Forms.Label
$Label.Text = $FIO[($i-1)]
$Label.Location  = New-Object System.Drawing.Point(10,($i*20+20))
$Label.AutoSize = $tcome
$main_form.Controls.Add($Label)


$TextBox = New-Object System.Windows.Forms.TextBox
$textBox.Name = "TextBox"+$i;
$TextBox.Location  = New-Object System.Drawing.Point(256,($i*20+20))
$TextBox.Text = $transname[($i-1)]
$main_form.Controls.Add($TextBox)


$i=$i+1
}
$button = New-Object System.Windows.Forms.Button
$button.Text = 'Add'
$button.Location = New-Object System.Drawing.Point(10,($i*20+20))
$main_form.Controls.Add($button)


$Label2 = New-Object System.Windows.Forms.Label
$Label2.Location  = New-Object System.Drawing.Point(10,($i*20+40))
$Label2.AutoSize = $tcome
$main_form.Controls.Add($Label2)

$ProgressBar = New-Object System.Windows.Forms.ProgressBar
$ProgressBar.Location  = New-Object System.Drawing.Point(10,($i*20+60))
$main_form.Controls.add($ProgressBar)

#клик по кнопке добавить
$button.Add_Click({
$progress=(100/$i)
$ProgressBar.Value = $progress

$controls = $main_form.controls
For ($j=1; $j -lt $i; $j++)  {
$text1=$controls['TextBox'+$j].text
$Label2.Text = "Adding "+$text1+"..."
#Add AD Users
$UPN=$text1+$Domain

#Write-Host $FIO[($j-1)]
#Write-Host $FN[($j-1)] 
#Write-Host $SN[($j-1)] 
#Write-Host $text1
#Write-Host $UPN
#Write-Host $City[($j-1)]
#Write-Host $Company[($j-1)]
#Write-Host $Departament[($j-1)]
#Write-Host $Title[($j-1)]
#Write-Host $Phone[($j-1)]
#Write-Host $Password[($j-1)]

# Отключение проверки отзыва сертификата при подключении к удаленному PowerShell
$sessionOption = New-PSSessionOption -SkipRevocationCheck

#Добавление пользователя в AD
Write-host "Создаю Учетную запись в AD"
New-ADUser -Name $FIO[($j-1)] –GivenName $FN[($j-1)] –Surname $SN[($j-1)] –DisplayName $FIO[($j-1)]  –SamAccountName $text1 –UserPrincipalName $UPN -City $City[($j-1)] -Company $Company[($j-1)] -Department $Departament[($j-1)] -Title $Title[($j-1)] -OfficePhone $Phone[($j-1)] -Path $OU
Set-ADAccountPassword -Identity $text1 -NewPassword (ConvertTo-SecureString -AsPlainText $Password[($j-1)] -Force)
Enable-ADAccount -Identity $text1
Start-sleep -s 2



#Создание почтового ящика
if ($checkbox1.Checked -eq $tcome)
{
    Write-host "Создаю почтовый ящик"
    $body=$body+"Создан почтовый ящик "+$text1+$Domain+"`n`n"
    $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri $exch_server -Authentication Kerberos -Credential $UserCredential -SessionOption $sessionOption 
    Import-PSSession $Session
    Enable-Mailbox -Identity $domain_short$text1 -Database $exch_database
    Remove-PSSession $Session
    Start-sleep -s 3
  }
  #/создание ящика

#Добавление на Lync User
if ($checkbox2.Checked -eq $tcome)
{
    Write-host "Создаю Skype"
    $body=$body+"Создан Skype "+$text1+$Domain+"`n`n"
    Write-host "1**********"
    $Session = New-PSSession -ConnectionUri $skype_server -Credential $UserCredential -SessionOption $sessionOption 
    Write-host "2**********"
    Import-PSSession $Session
    Write-host "3**********"
    Enable-CsUser -Identity $domain_short$text1 -RegistrarPool $sip_pool -SipAddressType UserPrincipalName  -SipDomain $sip_domain
    Write-host "4**********"
    Remove-PSSession $Session
}
#/Добавление на Lync User


$ProgressBar.Value = $ProgressBar.Value+$progress
$body=$body+" "+$Departament[($j-1)]+"`n`n ФИО: "+$FIO[($j-1)]+"`n`n Логин: "+$text1+"`n`n Пароль: "+$Password[($j-1)]+"`n`n`n`n" 
}

#Отправка почты
if ($checkbox3.Checked -eq $tcome)
{
    $smtp = New-Object net.mail.smtpclient($SmtpServer)
    $smtp.Port=$smtp_port
    $smtp.Send($EmailFrom, $EmailTo, $Subject, $body)

}
#/отправка почты

    $wshell = New-Object -ComObject Wscript.Shell
    $wshell.Popup("Operation Completed",0,"Done",0x1)
    $ProgressBar.Value = 0
    })#/клик по кнопке добавить



$main_form.ShowDialog()

Он же на pastebin https://pastebin.com/bhqL7tvN

Первая версия скрипта https://pastebin.com/fNhuM9Nr

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

Внимание! Нажимая кнопку "Отправить комментарий" вы соглашаетесь с политикой конфиденциальности сайта.