Подробный гайд по Employee ID в Active Directory - Часть 2

Гайд по Employee ID в Active Directory: просмотр, изменение, массовое обновление через PowerShell, интеграция с HR-системами и автоматизация.

2026.10.03                  


Подробный гайд по Employee ID в Active Directory - Часть 2Подробный гайд по Employee ID в Active Directory - Часть 2

Способ 2: Одиночное изменение через PowerShell

Set-ADUser -Identity "username" -EmployeeID "12345"

Расширенный вариант с проверкой:

$username = "ivanov"
$newEmployeeID = "001234"

try {
    $user = Get-ADUser -Identity $username -Properties employeeID
    if ($user.employeeID -ne $newEmployeeID) {
        Set-ADUser -Identity $username -EmployeeID $newEmployeeID
        Write-Host "Employee ID успешно обновлён для $username: $newEmployeeID" -ForegroundColor Green
    } else {
        Write-Host "Employee ID уже установлен корректно для $username" -ForegroundColor Yellow
    }
} catch {
    Write-Error "Ошибка при обновлении: $_"
}



Способ 3: Массовое обновление из CSV-файла

Формат CSV-файла (employees.csv):

UserName,EmployeeID,FirstName,LastName,Department
ivanov,001234,Иван,Иванов,ИТ
petrov,001235,Пётр,Петров,Финансы
sidorov,001236,Алексей,Сидоров,Маркетинг

Скрипт импорта:

Import-Module ActiveDirectory

$csvPath = "C:\Scripts\employees.csv"
$logPath = "C:\Scripts\import_log.txt"
$users = Import-Csv $csvPath
$successCount = 0
$errorCount = 0

foreach ($user in $users) {
    try {
        $adUser = Get-ADUser -Identity $user.UserName
        Set-ADUser -Identity $adUser -EmployeeID $user.EmployeeID
        $successCount++
        Add-Content $logPath "[$(Get-Date)] Успешно: $($user.UserName) -> $($user.EmployeeID)"
    } catch {
        $errorCount++
        Add-Content $logPath "[$(Get-Date)] Ошибка: $($user.UserName) - $_"
    }
}

Write-Host "Импорт завершён. Успешно: $successCount, Ошибок: $errorCount"

Способ 4: Изменение через ADSI Edit

  1. Откройте adsiedit.msc
  2. Подключитесь к нужному домену
  3. Перейдите к объекту пользователя
  4. Щёлкните правой кнопкой → «Свойства»
  5. Найдите employeeID
  6. Измените значение

Внимание:

ADSI Edit — мощный инструмент, неосторожное использование которого может повредить структуру AD.


5. ПРОВЕРКА И ВАЛИДАЦИЯ

Поиск пользователя по Employee ID

Get-ADUser -Filter {employeeID -eq "12345"} -Properties employeeID | 
    Select-Object Name, SamAccountName, employeeID, Enabled

Поиск всех пользователей без Employee ID

Get-ADUser -Filter * -Properties employeeID | 
    Where-Object { -not $_.employeeID -or $_.employeeID -eq "" } | 
    Select-Object Name, SamAccountName, Department | 
    Sort-Object Name | 
    Format-Table -AutoSize

Поиск дубликатов Employee ID

Get-ADUser -Filter * -Properties employeeID | 
    Where-Object { $_.employeeID } | 
    Group-Object employeeID | 
    Where-Object { $_.Count -gt 1 } | 
    ForEach-Object {
        Write-Host "Дубликат Employee ID: $($_.Name)" -ForegroundColor Red
        $_.Group | ForEach-Object {
            Write-Host "  Пользователь: $($_.Name) ($($_.SamAccountName))"
        }
        Write-Host ""
    }

Проверка формата Employee ID

# Проверка, что Employee ID соответствует формату (6 цифр)
Get-ADUser -Filter * -Properties employeeID | 
    Where-Object { $_.employeeID -and $_.employeeID -notmatch '^\d{6}$' } | 
    Select-Object Name, SamAccountName, employeeID | 
    Format-Table -AutoSize

Полная валидация с отчётом

$report = @()
$allUsers = Get-ADUser -Filter * -Properties employeeID, Department, Enabled

$withoutID = $allUsers | Where-Object { -not $_.employeeID }
$duplicates = $allUsers | Where-Object { $_.employeeID } | 
    Group-Object employeeID | Where-Object { $_.Count -gt 1 }

$report += "=== ОТЧЁТ ПО ВАЛИДАЦИИ EMPLOYEE ID ==="
$report += "Дата: $(Get-Date)"
$report += "Всего пользователей: $($allUsers.Count)"
$report += "Без Employee ID: $($withoutID.Count)"
$report += "Групп дубликатов: $($duplicates.Count)"
$report += ""
$report += "=== ПОЛЬЗОВАТЕЛИ БЕЗ EMPLOYEE ID ==="
$withoutID | ForEach-Object { $report += "$($_.Name) ($($_.SamAccountName)) - $($_.Department)" }

$report | Out-File "C:\Reports\employeeID_validation.txt" -Encoding UTF8

6. ИНТЕГРАЦИЯ С HR-СИСТЕМАМИ

Общие принципы интеграции

Интеграция Active Directory с HR-системой строится на использовании Employee ID как единого ключа сопоставления между записью сотрудника в кадровой системе и учётной записью в домене.




Архитектура типовой интеграции

HR-система (источник истины)
        ↓
   Экспорт данных (ежедневно/ежечасно)
        ↓
   Промежуточное хранилище (БД/файл)
        ↓
   Скрипт синхронизации
        ↓
   Active Directory (приёмник)

Пример интеграции с 1С:ЗУП

# Экспорт из 1С в CSV
# Формат: EmployeeID, FullName, Position, Department, HireDate, TerminationDate

$hrData = Import-Csv "C:\HR_Export\1c_export.csv" -Delimiter ";" -Encoding Default

foreach ($employee in $hrData) {
    $adUser = Get-ADUser -Filter "employeeID -eq '$($employee.EmployeeID)'" -Properties *

    if ($adUser) {
        # Обновление существующего пользователя
        Set-ADUser -Identity $adUser `
            -Description $employee.Position `
            -Department $employee.Department `
            -Title $employee.Position

        # Проверка на увольнение
        if ($employee.TerminationDate -and $employee.TerminationDate -le (Get-Date).ToString("yyyy-MM-dd")) {
            Disable-ADAccount -Identity $adUser
            Write-Host "Учётная запись отключена: $($adUser.Name)" -ForegroundColor Yellow
        }
    } else {
        Write-Warning "Сотрудник $($employee.FullName) не найден в AD"
    }
}

Пример интеграции с SAP HCM

# Данные из SAP экспортируются через RFC или веб-сервис
$sapEmployees = Invoke-RestMethod -Uri "https://sap-hr.company.com/api/employees" -Headers $authHeaders

foreach ($emp in $sapEmployees) {
    $adUser = Get-ADUser -Filter "employeeID -eq '$($emp.PersonnelNumber)'"
    if ($adUser) {
        Set-ADUser -Identity $adUser `
            -Department $emp.OrganizationalUnit `
            -Title $emp.Position `
            -Company $emp.CompanyCode
    }
}

Автоматическое создание учётной записи при приёме на работу

function New-EmployeeAccount {
    param(
        [string]$EmployeeID,
        [string]$FirstName,
        [string]$LastName,
        [string]$Department,
        [string]$Position
    )

    # Формирование имени пользователя
    $translitTable = @{
        'а'='a';'б'='b';'в'='v';'г'='g';'д'='d';'е'='e';'ё'='e';'ж'='zh';
        'з'='z';'и'='i';'й'='y';'к'='k';'л'='l';'м'='m';'н'='n';'о'='o';
        'п'='p';'р'='r';'с'='s';'т'='t';'у'='u';'ф'='f';'х'='kh';'ц'='ts';
        'ч'='ch';'ш'='sh';'щ'='shch';'ъ'='';'ы'='y';'ь'='';'э'='e';'ю'='yu';'я'='ya'
    }

    $lastNameTranslit = ""
    foreach ($char in $LastName.ToLower().ToCharArray()) {
        if ($translitTable.ContainsKey([string]$char)) {
            $lastNameTranslit += $translitTable[[string]$char]
        } else { $lastNameTranslit += $char }
    }

    $firstNameInitial = $translitTable[[string]$FirstName.ToLower()[0]]
    $samAccountName = "$firstNameInitial.$lastNameTranslit"

    # Проверка на существование
    $existing = Get-ADUser -Filter "SamAccountName -eq '$samAccountName'"
    if ($existing) {
        $samAccountName = "$samAccountName$((Get-Random -Minimum 10 -Maximum 99))"
    }

    # Определение OU на основе отдела
    $ouMapping = @{
        'ИТ' = 'OU=IT,OU=Users,DC=domain,DC=com'
        'Финансы' = 'OU=Finance,OU=Users,DC=domain,DC=com'
        'Маркетинг' = 'OU=Marketing,OU=Users,DC=domain,DC=com'
    }
    $targetOU = $ouMapping[$Department]
    if (-not $targetOU) { $targetOU = 'OU=Users,DC=domain,DC=com' }

    # Генерация временного пароля
    $tempPassword = "Temp$(Get-Random -Minimum 10000 -Maximum 99999)!$(Get-Random -Minimum 100 -Maximum 999)"
    $securePassword = ConvertTo-SecureString $tempPassword -AsPlainText -Force

    # Создание пользователя
    New-ADUser -Name "$LastName $FirstName" `
        -SamAccountName $samAccountName `
        -UserPrincipalName "$samAccountName@domain.com" `
        -GivenName $FirstName `
        -Surname $LastName `
        -Department $Department `
        -Title $Position `
        -EmployeeID $EmployeeID `
        -Path $targetOU `
        -AccountPassword $securePassword `
        -Enabled $true `
        -ChangePasswordAtLogon $true `
        -PasswordNeverExpires $false

    Write-Host "Создан пользователь: $samAccountName" -ForegroundColor Green
    Write-Host "Employee ID: $EmployeeID" -ForegroundColor Green
    Write-Host "Временный пароль: $tempPassword" -ForegroundColor Yellow
}



Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.


Статью подготовил: Аверко Денис Сергеевич @Nymexis г. Омск (специалист по ЗИ)

Комментарии

Загрузка...
Если комментарии не загружаются, можете попробовать отключить блокировщик рекламы для этого сайта