Подробный гайд по 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
- Откройте
adsiedit.msc - Подключитесь к нужному домену
- Перейдите к объекту пользователя
- Щёлкните правой кнопкой → «Свойства»
- Найдите
employeeID - Измените значение
Внимание:
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
}
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.