Автоматический ввод новых сотрудников в домен создание пользователя, почты, доступов одной кнопкой

Проблема

При приёме нового сотрудника администратору приходится выполнять множество рутинных операций: создать учётную запись в 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 для PowerShellExchange Management ShellMicrosoft 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.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Популярные
Новые Старые

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
Menu