Проблема
При приёме нового сотрудника администратору приходится выполнять множество рутинных операций: создать учётную запись в Active Directory, задать пароль, настроить членство в группах, создать почтовый ящик в Exchange (или в Office 365), назначить доступ к сетевым папкам, а иногда и создать учётную запись в 1С или других корпоративных системах. Всё это занимает время, отвлекает от более важных задач и, что самое неприятное, часто делается вручную, что приводит к ошибкам (неправильное имя, не та группа, забыли создать почту). Нужно автоматизировать процесс так, чтобы ввод нового сотрудника выполнялся по нажатию одной кнопки (или через простую форму) с минимальным участием администратора.
Решение
Используем PowerShell для интеграции с Active Directory, Exchange (или Microsoft Graph для Office 365), файловым сервером и другими системами. Все действия объединим в один скрипт, который будет принимать параметры сотрудника (имя, фамилия, должность, отдел и т.д.) и создавать всё необходимое. В качестве интерфейса можно использовать:
- Простой HTML-форму с обработкой на сервере (например, через IIS + PowerShell).
- Файл CSV, который импортируется по расписанию из HR-системы.
- Web-приложение на 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):
<!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) ---
# Пример для Exchange on-premises (требуется импорт модуля Exchange)
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.







