|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Создание пользователей PowerShell |
|
PowerShell - [решено] Создание пользователей PowerShell
|
Новый участник Сообщения: 3 |
Профиль | Отправить PM | Цитировать
Всем привет!
Коллеги, решил попытать счастья в PowerShell и для автоматизации рутинных задач решил написать скрипт по созданию пользователей в ActiveDirectory. Объём небольшой, поэтому решил использовать GUI форму. И глазу приятно, и интересно. Застопорился вот на чем: При создании пользователя, логин транслитерируется и формируется автоматически по стандарту организации (Фамилия_Инициал1Инициал2, например Ivanov_II). Но если пользователь уже существует в рамках леса - то естественно появляется ошибка в уникальности SamAccountName. Хочу сделать так, чтобы при занятом логине, в конце SamAccountName добавлялась цифра 1, 2, 3 и тд. То есть если найден Ivanov_II в разрезе леса, то должен создаться пользователь с логином Ivanov_II1 и так далее Прошу Вас, опытных вояк, помочь с такой задачей. Недели 2 мучаюсь, логику как должно быть понимаю, но с реализацией хромает. Ниже разместил код, который сварганил. P.S. прошу не бросаться тапками, первый в карьере скрипт : ) P.P.S. Специально конфиденциальную информацию заменил пояснительными словами. Спасибо! Скрытый текст
#Создание УЗ
# Функция транслитерации ru->en Function global:Get-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]'ё' = "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]'щ' = "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 } #Формирование лога $logs = "C:\test\LogFile.csv" #Для использования функционала .NET загружаем класс System.Windows.forms Add-Type -assembly System.Windows.Forms #Создание графического окна $window_form = New-Object System.Windows.Forms.Form #Установка заголовка и выведение окна формы в пикселях $window_form.Text = "Создание учетной записи в домене GBU" $window_form.Width = 800 $window_form.Height = 550 #Установка возможности растягивания формы $window_form.AutoSize = $true #Фамилия $formLabel1 = New-Object System.Windows.Forms.Label $formLabel1.Text = "Фамилия" $formLabel1.Location = New-Object System.Drawing.Point (0,10) $formLabel1.AutoSize = $true $window_form.Controls.Add($formLabel1) #Создание текстового поля $textBox1 = New-Object System.Windows.Forms.TextBox $textBox1.Text = "" $textBox1.Location = New-Object System.Drawing.Point (65,10) $textBox1.Size = New-Object System.Drawing.Size (180,20) $window_form.Controls.Add($textBox1) #Имя $formLabel2 = New-Object System.Windows.Forms.Label $formLabel2.Text = "Имя" $formLabel2.Location = New-Object System.Drawing.Point (0,40) $formLabel2.AutoSize = $true $window_form.Controls.Add($formLabel2) #Создание текстового поля $textBox2 = New-Object System.Windows.Forms.TextBox $textBox2.Text = "" $textBox2.Location = New-Object System.Drawing.Point (65,40) $textBox2.Size = New-Object System.Drawing.Size (180,20) $window_form.Controls.Add($textBox2) #Отчество $formLabel3 = New-Object System.Windows.Forms.Label $formLabel3.Text = "Отчество" $formLabel3.Location = New-Object System.Drawing.Point (0,70) $formLabel3.AutoSize = $true $window_form.Controls.Add($formLabel3) #Создание текстового поля $textBox3 = New-Object System.Windows.Forms.TextBox $TextBox3.Text = "" $textBox3.Location = New-Object System.Drawing.Point (65,70) $textBox3.Size = New-Object System.Drawing.Size (180,20) $window_form.Controls.Add($textBox3) #Должность $formLabel4 = New-Object System.Windows.Forms.Label $formLabel4.Text = "Должность" $formLabel4.Location = New-Object System.Drawing.Point (250,10) $formLabel4.AutoSize = $true $window_form.Controls.Add($formLabel4) #Создание текстового поля $textBox4 = New-Object System.Windows.Forms.TextBox $textBox4.Text = "" $textBox4.Location = New-Object System.Drawing.Point (320,10) $textBox4.Size = New-Object System.Drawing.Size (180,20) $window_form.Controls.Add($textBox4) #Отдел $formLabel5 = New-Object System.Windows.Forms.Label $formLabel5.Text = "Отдел" $formLabel5.Location = New-Object System.Drawing.Point (250,40) $formLabel5.AutoSize = $true $window_form.Controls.Add($formLabel5) #Создание текстового поля $textBox5 = New-Object System.Windows.Forms.TextBox $textBox5.Text = "" $textBox5.Location = New-Object System.Drawing.Point (320,40) $textBox5.Size = New-Object System.Drawing.Size (180,20) $window_form.Controls.Add($textBox5) #Контейнер $formLabel6 = New-Object System.Windows.Forms.Label $formLabel6.Text = "Контейнер" $formLabel6.Location = New-Object System.Drawing.Point (0,100) $formLabel6.AutoSize = $true $window_form.Controls.Add($formLabel6) #Создание текстового поля $textBox6 = New-Object System.Windows.Forms.ComboBox $textBox6.Location = New-Object System.Drawing.Point (65,100) $textBox6.Size = New-Object System.Drawing.Size (450,20) $textBox6.Text = "" $OU = Get-ADOrganizationalUnit -LDAPFilter '(Name=*)' -SearchBase 'Путь к головной OU в АД' -Properties Name | Sort-Object -CaseSensitive foreach ($OU1 in $OU) { $textBox6.Items.Add($OU1); } $window_form.Controls.Add($textBox6) #Email с кредами $formLabel7 = New-Object System.Windows.Forms.Label $formLabel7.Text = "Письмо на" $formLabel7.Location = New-Object System.Drawing.Point (250,70) $formLabel7.AutoSize = $true $window_form.Controls.Add($formLabel7) #Создание текстового поля $textBox7 = New-Object System.Windows.Forms.ComboBox $textBox7.Text = "" $textBox7.Location = New-Object System.Drawing.Point (320,70) $textBox7.Size = New-Object System.Drawing.Size (180,20) $csv = Import-Csv "\\NETLOGON\Scrips\Email.csv" -Encoding UTF8 -Delimiter ";" foreach ($User in $csv) { $textBox7.Items.Add($User.Email); } $window_form.Controls.Add($textBox7) #Кнопка выхода $CloseButton = New-Object System.Windows.Forms.Button $CloseButton.Location = New-Object System.Drawing.Point (100,300) $CloseButton.Text = "Выход из программы" $CloseButton.Width = 150 $CloseButton.Height = 50 $CloseButton.Add_Click({$window_form.Close()}) $window_form.Controls.Add($CloseButton) #создание кнопки создания $button = New-Object System.Windows.Forms.Button $button.Text = 'Создать учетную запись' $button.Location = New-Object System.Drawing.Point (550,20) $button.Width = 160 $button.Height = 50 $window_form.Controls.Add($button) #Привязка клика $button.Add_Click( { [string]$Domain = "@домен" $Company = "Наименование организации" $OU = $textBox6.Text $Server = "Контроллер домена" #Имя $FirstName = $textBox2.Text #Отчество $Initials = $textBox3.Text #Отдел $Departament = $textBox5.Text #Должность $Title = $textBox4.Text #Фамилия $SN = $textBox1.Text #Формирование пароля $pass = "Aa123456" | ConvertTo-SecureString -AsPlainText -Force #Отображаемое имя $FullName = $SN + " " + $FirstName + " " + $Initials #Полное имя $Name = $FullName #Перевод ФИО в транслит $translateSN = Translit $SN $translateFirstname = Translit $FirstName.Split("") $translateInitiasl = Translit $Initials #Формирование логина по стандарту организации $sam = $translateSN + "_" + $translateFirstname[0] + "" + $translateInitiasl[0] $UserPrincipalName = $sam + $Domain #Команда на создание юзера на основании вышеперечисленных переменных New-ADUser -Path $OU -Server $Server -Name $Name -Department $Departament -Title $Title -DisplayName $FullName -GivenName $FirstName -Initials $Initials -Surname $SN -Company $Company -AccountPassword $pass -UserPrincipalName $UserPrincipalName -SamAccountName $sam -Enabled $true -ChangePasswordAtLogon $true Out-File $logs -Append -InputObject ($sam + ";" + $FullName + ";" + (Get-Date).ToLongDateString() ) #Креды от почтового ящика, с которого отправится письмо $pass = ConvertTo-SecureString "Пароль от ящика" -AsPlainText -Force $creds = New-Object System.Management.Automation.PSCredential ("Email СТП", $pass) #Отправка письма с результатами Send-MailMessage -From email СТП -To $textBox7.Text -SmtpServer Почтовый сервер -Subject "Создана учетная запись" -Body "<h1>Добрый день!</h1> <p><strong>Создана учетная запись в домене GBU:</strong></p> <p><strong>Логин: $sam </p></strong> <p><strong> Пароль: Aa123456 </p></strong> <p><strong> Дата и время создания: $(Get-Date -format g) </p></strong> <p><strong> ФИО: $FullName </p></strong>" -Encoding 'UTF8' -BodyAsHtml -Credential $creds } ) #Запуск формы $window_form.ShowDialog() |
|
Отправлено: 11:07, 08-08-2022 |
fascinating rhythm Сообщения: 6610
|
Профиль | Отправить PM | Цитировать $c = 1 while ($(try {Get-ADUser $sam} catch {$null})) { $sam = "$($sam -replace "\d+$")$c" $c++ } И заставлять пользователей набирать символ подчёркивания при логине негуманно. Лучше вообще без него, например, ivanovii или, если уж совсем нельзя без разделителя, выбирайте такой, который можно набрать без нажатия на Shift. |
------- Отправлено: 09:55, 09-08-2022 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 3
|
Профиль | Отправить PM | Цитировать Добрый день!
Спасибо за ответ! Цитата DJ Mogarych:
Цитата DJ Mogarych:
По коду: Спасибо, сейчас начал формироваться уникальный логин (получаю отбивку на почту), но возникает ошибка с созданием. С чем может быть связано ? $c = 1 while ($(try {Get-ADUser $sam} catch {$null})) { $sam = "$($sam -replace "\d+$")$c" $c++ } New-ADUser -Path $OU -Server $Server -Name $Name -Department $Departament -Title $Title -DisplayName $FullName -GivenName $FirstName -Initials $Initials -Surname $SN -Company $Company -AccountPassword $pass -UserPrincipalName $UserPrincipalName -SamAccountName $sam -Enabled $true -ChangePasswordAtLogon $true Out-File $logs -Append -InputObject ($sam + ";" + $FullName + ";" + (Get-Date).ToLongDateString() ) Ошибка стандартная, New-ADUser : Не удалось выполнить операцию, так как значение имени участника-пользователя, предоставленное для добавления или изменения, не является уникальным в пределах леса |
||
Отправлено: 10:24, 09-08-2022 | #3 |
Новый участник Сообщения: 3
|
Профиль | Отправить PM | Цитировать Разобрался. Формирование UPN сместил под функцию и все отрабатывает корректно!
Спасибо большое за помощь! |
Отправлено: 11:00, 09-08-2022 | #4 |
fascinating rhythm Сообщения: 6610
|
Профиль | Отправить PM | Цитировать Цитата Tuniq:
|
||
------- Отправлено: 14:05, 09-08-2022 | #5 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
PowerShell - Создание PDF в Powershell | DJ Mogarych | Скриптовые языки администрирования Windows | 11 | 17-03-2020 15:16 | |
PowerShell - Powershell GUI и создание пользователей в AD | Charg | Скриптовые языки администрирования Windows | 17 | 14-01-2019 14:55 | |
PowerShell - Создание зеркального тома в Powershell | sacredboy | Скриптовые языки администрирования Windows | 3 | 22-03-2017 09:55 | |
PowerShell - Аудит пользователей в систему PowerShell | smotritel89 | Скриптовые языки администрирования Windows | 7 | 06-02-2016 02:49 | |
PowerShell - Ошибки в Powershell при создании пользователей | Baggurd | Скриптовые языки администрирования Windows | 18 | 06-06-2012 20:04 |
|