Загрузка данных


$CSVPath = "C:\Lab\new_users.csv"
$LogFile = "C:\Lab\user_creation_$(Get-Date -Format yyyyMMdd_HHmmss).log"
$HomeDrivePath = "\\fs\home"
$SMTPServer = "smtp.contoso.local"
$FromEmail = "ad-automation@contoso.local"
$ToEmail = "admin@contoso.local"
$Domain = "contoso.local"
$Global:CreatedCount = 0
$Global:FailedCount = 0

function Write-Log {
    param($Message, $Level = "INFO")
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    Add-Content -Path $LogFile -Value "$timestamp - [$Level] - $Message"
}

function New-RandomPassword {
    $upper = 'ABCDEFGHJKLMNPQRSTUVWXYZ'.ToCharArray()
    $lower = 'abcdefghijkmnopqrstuvwxyz'.ToCharArray()
    $numbers = '123456789'.ToCharArray()
    $special = '!@#$%^&*'.ToCharArray()
    $pass = @()
    $pass += ($upper | Get-Random)
    $pass += ($lower | Get-Random)
    $pass += ($numbers | Get-Random)
    $pass += ($special | Get-Random)
    $all = $upper + $lower + $numbers + $special
    for ($i = 4; $i -lt 12; $i++) { $pass += $all | Get-Random }
    return -join ($pass | Sort-Object { Get-Random })
}

function New-UserFromRecord {
    param($UserRecord)
    $logonName = $UserRecord.Logon
    $firstName = $UserRecord.FirstName
    $lastName = $UserRecord.LastName
    $ouPath = $UserRecord.OU
    $groupName = $UserRecord.Group
    $title = $UserRecord.Title
    
    if ([string]::IsNullOrWhiteSpace($logonName)) {
        Write-Log "Пустое поле Logon" "ERROR"
        $Global:FailedCount++; return $false
    }
    
    try {
        if (Get-ADUser -Filter "SamAccountName -eq '$logonName'" -ErrorAction Stop) {
            Write-Log "Пользователь $logonName уже существует" "WARNING"
            $Global:FailedCount++; return $false
        }
        
        $plainPassword = New-RandomPassword
        $securePassword = ConvertTo-SecureString $plainPassword -AsPlainText -Force
        
        New-ADUser -Name "$firstName $lastName" -GivenName $firstName -Surname $lastName `
            -SamAccountName $logonName -UserPrincipalName "$logonName@$Domain" -Path $ouPath `
            -AccountPassword $securePassword -Enabled $true -ChangePasswordAtLogon $true -Title $title `
            -ErrorAction Stop
        
        Write-Log "СОЗДАН: $logonName (пароль: $plainPassword)" "SUCCESS"
        
        if ($groupName) {
            $group = Get-ADGroup -Identity $groupName -ErrorAction SilentlyContinue
            if ($group) { Add-ADGroupMember -Identity $groupName -Members $logonName; Write-Log "Добавлен в группу $groupName" "SUCCESS" }
            else { Write-Log "Группа $groupName не найдена" "WARNING" }
        }
        
        $homeFolder = "$HomeDrivePath\$logonName"
        if (Test-Path $HomeDrivePath) {
            if (-not (Test-Path $homeFolder)) {
                New-Item -Path $homeFolder -ItemType Directory -Force | Out-Null
                $acl = Get-Acl $homeFolder
                $acl.SetAccessRuleProtection($true, $false)
                $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("$Domain\$logonName", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")
                $acl.AddAccessRule($rule)
                Set-Acl -Path $homeFolder -AclObject $acl
                Set-ADUser -Identity $logonName -HomeDrive "H:" -HomeDirectory $homeFolder
                Write-Log "Домашняя папка создана" "SUCCESS"
            }
        } else { Write-Log "Сетевой путь недоступен" "ERROR" }
        
        $Global:CreatedCount++
        return $true
    }
    catch {
        Write-Log "Ошибка: $_" "ERROR"
        $Global:FailedCount++
        return $false
    }
}

Import-Module ActiveDirectory -ErrorAction Stop
$users = Import-Csv $CSVPath -Encoding UTF8

foreach ($user in $users) { New-UserFromRecord $user }

Write-Log "Итог: создано $Global:CreatedCount, ошибок $Global:FailedCount" "INFO"

Send-MailMessage -SmtpServer $SMTPServer -From $FromEmail -To $ToEmail `
    -Subject "Результаты создания пользователей" `
    -Body "Создано: $Global:CreatedCount`nОшибок: $Global:FailedCount`nЛог: $LogFile" -BodyAsText