Проблема
При приёме нового сотрудника администратору приходится выполнять множество рутинных операций. Создать учётную запись в Active Directory, задать пароль, настроить членство в группах, создать почтовый ящик в Exchange (или в Office 365), назначить доступ к сетевым папкам, а иногда и создать учётную запись в 1С или других корпоративных системах. Всё это занимает время, отвлекает от более важных задач и, что самое неприятное, часто делается вручную, что приводит к ошибкам (неправильное имя, не та группа, забыли создать почту). Нужно автоматизировать процесс так, чтобы ввод нового сотрудника выполнялся по нажатию одной кнопки (или через простую форму) с минимальным участием администратора.
Решение
Используем PowerShell для интеграции с Active Directory, Exchange (или Microsoft Graph для Office 365), файловым сервером и другими системами. Все действия объединим в один скрипт, который будет принимать параметры сотрудника (имя, фамилия, должность, отдел и т.д.) и создавать всё необходимое. В качестве интерфейса можно использовать простое HTML форму с обработкой на сервере (например, через IIS + PowerShell), файл CSV, который импортируется по расписанию из HR системы, или веб-приложение на ASP.NET Core с вызовом PowerShell через REST API.
В этой статье мы создадим PowerShell скрипт, который создаёт пользователя в AD, настраивает почтовый ящик в Exchange (on premises) или Office 365 (через модуль Exchange Online), а также назначает доступы к сетевым папкам через членство в группах безопасности.
Основные источники: документация по модулю Active Directory для PowerShell, Exchange Management Shell, Microsoft Graph PowerShell, модуль SmbShare.
Пошаговая инструкция
1. Подготовка окружения
На сервере, откуда будет запускаться скрипт, должны быть установлены и настроены следующие компоненты.
Active Directory PowerShell Module (входит в RSAT или устанавливается на контроллер домена).
Exchange Management Shell (если Exchange on premises) или Exchange Online PowerShell Module (если Office 365).
Модули для работы с файловыми шариками (обычно встроены в Windows).
Для работы с Office 365 потребуется установка модуля Exchange Online и модуля Microsoft Graph.
Установка модуля Exchange Online.
powershell
Install-Module -Name ExchangeOnlineManagement -Force -AllowClobber
Установка модуля Active Directory (на компьютере без AD DS).
powershell
Install-WindowsFeature -Name RSAT-AD-PowerShell
2. Создание формы ввода (HTML + PowerShell)
Для простоты можно создать веб-страницу, которая будет передавать данные в PowerShell скрипт. Например, используем IIS с включённым CGI и запуск PowerShell скрипта через POST запрос.
2.1. HTML форма (файл newuser.html)
html
<!DOCTYPE html>
<html>
<head>
<title>Создание пользователя</title>
<meta charset="utf-8">
</head>
<body>
<h2>Форма ввода нового сотрудника</h2>
<form action="create_user.ps1" method="post">
<label>Имя:</label><br>
<input type="text" name="FirstName"><br>
<label>Фамилия:</label><br>
<input type="text" name="LastName"><br>
<label>Логин (без домена):</label><br>
<input type="text" name="SamAccountName"><br>
<label>Должность:</label><br>
<input type="text" name="Title"><br>
<label>Отдел:</label><br>
<select name="Department">
<option value="IT">IT</option>
<option value="Sales">Sales</option>
<option value="HR">HR</option>
</select><br>
<label>Пароль (временный):</label><br>
<input type="password" name="Password"><br>
<input type="submit" value="Создать пользователя">
</form>
</body>
</html>
2.2. PowerShell скрипт create_user.ps1, который будет обрабатывать запрос
powershell
<#
.SYNOPSIS
Автоматическое создание пользователя в AD, почтового ящика и доступов.
.DESCRIPTION
Скрипт принимает параметры через HTTP POST (или командную строку) и выполняет все действия.
#>
# Получение параметров из POST запроса (если запущено как CGI)
if ($env:REQUEST_METHOD -eq "POST") {
$requestBody = [Console]::In.ReadToEnd()
$fields = @{}
$requestBody -split '&' | ForEach-Object {
$key, $val = $_ -split '='
$fields[[System.Web.HttpUtility]::UrlDecode($key)] = [System.Web.HttpUtility]::UrlDecode($val)
}
$FirstName = $fields["FirstName"]
$LastName = $fields["LastName"]
$SamAccountName = $fields["SamAccountName"]
$Title = $fields["Title"]
$Department = $fields["Department"]
$Password = $fields["Password"]
} else {
# Если скрипт запускается вручную, можно задать параметры через аргументы
param(
[string]$FirstName,
[string]$LastName,
[string]$SamAccountName,
[string]$Title,
[string]$Department,
[string]$Password
)
}
# --- Конфигурация ---
$DomainDN = "dc=company,dc=local"
$DefaultOU = "OU=Users,OU=Company,$DomainDN"
$GroupPrefix = "GRP_"
$FileServer = "FS01"
$SharePath = "\\$FileServer\Profiles"
# --- Функция отправки сообщения в Telegram (опционально) ---
function Send-TelegramMessage {
param([string]$Message)
$BotToken = "ваш_токен"
$ChatId = "ваш_chat_id"
$url = "https://api.telegram.org/bot$BotToken/sendMessage"
$body = @{ chat_id = $ChatId; text = $Message }
Invoke-RestMethod -Uri $url -Method Post -Body $body -ErrorAction SilentlyContinue
}
# --- 1. Создание пользователя в Active Directory ---
try {
# Проверка существования пользователя
$existingUser = Get-ADUser -Filter "SamAccountName -eq '$SamAccountName'" -ErrorAction SilentlyContinue
if ($existingUser) {
throw "Пользователь $SamAccountName уже существует."
}
# Создание пользователя
$userParams = @{
Name = "$FirstName $LastName"
GivenName = $FirstName
Surname = $LastName
SamAccountName = $SamAccountName
UserPrincipalName = "$SamAccountName@company.local"
AccountPassword = (ConvertTo-SecureString $Password -AsPlainText -Force)
Enabled = $true
Path = $DefaultOU
Title = $Title
Department = $Department
ChangePasswordAtLogon = $true
}
New-ADUser @userParams
Write-Host "✅ Пользователь $SamAccountName создан в AD."
Send-TelegramMessage "✅ Пользователь $SamAccountName ($FirstName $LastName) создан в AD."
} catch {
Send-TelegramMessage "❌ Ошибка при создании пользователя: $($_.Exception.Message)"
exit 1
}
# --- 2. Добавление пользователя в группы доступа на основе отдела ---
try {
switch ($Department) {
"IT" { $groups = @("GRP_IT_All", "GRP_VPN_Users") }
"Sales" { $groups = @("GRP_Sales_All", "GRP_CRM_Users") }
"HR" { $groups = @("GRP_HR_All", "GRP_HR_Confidential") }
default { $groups = @() }
}
foreach ($group in $groups) {
Add-ADGroupMember -Identity $group -Members $SamAccountName
Write-Host "✅ Пользователь добавлен в группу $group"
}
Send-TelegramMessage "✅ Пользователь добавлен в группы: $($groups -join ', ')"
} catch {
Send-TelegramMessage "⚠️ Ошибка при добавлении в группы: $($_.Exception.Message)"
}
# --- 3. Создание почтового ящика (Exchange on-premises или Office 365) ---
try {
# Для Exchange on-premises
# Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
# Enable-Mailbox -Identity $SamAccountName -Database "Mailbox Database 1"
# Для Office 365 (Exchange Online)
# Connect-ExchangeOnline -UserPrincipalName admin@company.onmicrosoft.com
# Enable-RemoteMailbox -Identity $SamAccountName -RemoteRoutingAddress "$SamAccountName@company.mail.onmicrosoft.com"
Write-Host "✅ Почтовый ящик создан."
Send-TelegramMessage "✅ Почтовый ящик создан для $SamAccountName@company.local"
} catch {
Send-TelegramMessage "⚠️ Ошибка при создании почтового ящика: $($_.Exception.Message)"
}
# --- 4. Создание домашней папки и настройка прав (опционально) ---
try {
$HomeFolder = "$SharePath\$SamAccountName"
New-Item -Path $HomeFolder -ItemType Directory -Force
# Назначение прав (полный доступ для пользователя)
$acl = Get-Acl $HomeFolder
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("$SamAccountName", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")
$acl.AddAccessRule($rule)
Set-Acl $HomeFolder $acl
Write-Host "✅ Домашняя папка создана: $HomeFolder"
Send-TelegramMessage "✅ Домашняя папка создана: $HomeFolder"
} catch {
Send-TelegramMessage "⚠️ Ошибка при создании домашней папки: $($_.Exception.Message)"
}
# --- 5. Отправка итогового отчёта ---
$finalMessage = @"
=== Создание пользователя завершено ===
Имя: $FirstName $LastName
Логин: $SamAccountName
Временный пароль: $Password
Группы: $($groups -join ', ')
Домашняя папка: $HomeFolder
"@
Send-TelegramMessage -Message $finalMessage
Write-Output $finalMessage
3. Настройка безопасности
3.1. Учётные данные для доступа к AD и Exchange
Скрипт должен запускаться от имени учётной записи, имеющей права на создание пользователей, почтовых ящиков и добавление в группы. Лучше всего использовать группу управляемых служб (gMSA) или служебную учётную запись с минимальными необходимыми правами.
3.2. Защита пароля в HTML форме
Пароль передаётся в открытом виде. Для production используйте HTTPS и шифрование на стороне клиента.
4. Интеграция с HR системой (альтернативный подход)
Вместо веб-формы можно настроить импорт из CSV файла, который формирует HR система. Например, каждый час скрипт проверяет новую папку с файлами и обрабатывает их.
powershell
$csvFiles = Get-ChildItem "C:\HR_Import\*.csv" | Where-Object { $_.LastWriteTime -gt (Get-Date).AddHours(-1) }
foreach ($file in $csvFiles) {
$users = Import-Csv $file -Encoding UTF8
foreach ($user in $users) {
# Вызов основной функции создания пользователя с параметрами из CSV
& "C:\Scripts\CreateUser.ps1" -FirstName $user.FirstName -LastName $user.LastName ...
}
Move-Item $file.FullName "C:\HR_Import\Processed\" -Force
}
5. Тестирование
Перед внедрением в production протестируйте скрипт на изолированной среде. Проверьте корректность создания пользователя в AD, правильное назначение групп, создание почтового ящика (в Exchange или O365), права на домашнюю папку.
Устранение распространённых проблем
ПроблемаВероятная причинаРешениеОшибка «Access denied» при создании пользователяУчётная запись не имеет прав на создание объектов в указанном OUЗапускать скрипт от имени пользователя с правами администратора домена или делегировать права на OUНе удаётся создать почтовый ящик в Exchange OnlineНе установлен модуль Exchange Online или не выполнена аутентификацияВыполнить Connect-ExchangeOnline перед созданием. Убедиться, что скрипт запускается с правами, позволяющими подключатьсяДомашняя папка создаётся, но пользователь не видит еёНеверные права на шару или NTFSПроверить, что пользователь добавлен в список доступа к шаре. Использовать Grant-SmbShareAccess для предоставления прав на шаруДублирование пользователейНесколько запусков скрипта для одного сотрудникаДобавить проверку существования пользователя в начале скриптаПароль в открытом виде в логахНе отключено логирование PowerShellИспользовать -ErrorAction SilentlyContinue и не выводить пароль в консоль
Итог
Мы создали систему автоматического ввода новых сотрудников в домен, которая за одну операцию создаёт учётную запись в Active Directory, настраивает почтовый ящик, добавляет пользователя в необходимые группы безопасности и создаёт домашнюю папку с правами. Создание пользователей Active Directory с помощью скрипта позволяет сократить время обработки заявки с 15-30 минут до нескольких секунд, исключает человеческие ошибки и даёт прозрачность процесса (уведомления в Telegram). Решение легко адаптируется под любую инфраструктуру. Можно добавить создание учётной записи в 1С, настройку VPN, выдачу сертификатов и другие интеграции. Для масштабирования рекомендуется использовать веб-интерфейс с интеграцией в портал самообслуживания или напрямую подключать скрипт к HR системе через CSV или API