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


<#
.SYNOPSIS
    Альтернативная установка драйвера через printui.dll (для обхода зависаний Add-PrinterDriver)
#>

$PrintServer = "PrintServer01"
$DriverSearchPattern = "TASKalfa 3501i"
$LocalTempPath = "C:\Temp\PrinterDriver"

try {
    Write-Host "1. Перезапуск службы Диспетчера печати (Spooler) для сброса блокировок..." -ForegroundColor Cyan
    Restart-Service -Name Spooler -Force

    Write-Host "2. Получение точного имени драйвера с принт-сервера..." -ForegroundColor Cyan
    $HKLM = [uint32]2147483650$WmiReg = [WMIClass]"\\$PrintServer\root\default:StdRegProv"
    
    $DriversKey = "SYSTEM\CurrentControlSet\Control\Print\Environments\Windows x64\Drivers\Version-3"
    $SubKeys = ($WmiReg.EnumKey($HKLM,$DriversKey)).sNames
    $TargetDriverKey =$SubKeys | Where-Object { $_ -like "*$DriverSearchPattern*" } | Select-Object -First 1

    if (-not $TargetDriverKey) {
        throw "Драйвер не найден в реестре сервера $PrintServer."
    }

    Write-Host "Драйвер: '$TargetDriverKey'" -ForegroundColor Green

    # Читаем путь к INF
    $InfPathOnServer = ($WmiReg.GetStringValue($HKLM, "$DriversKey\$TargetDriverKey", "InfPath")).sValue
    $ServerFolder = Split-Path $InfPathOnServer -Parent$NetworkFolder = "\\$PrintServer\" + ($ServerFolder -replace ':', '$')

    Write-Host "3. Копирование файлов на RDP..." -ForegroundColor Cyan
    if (Test-Path $LocalTempPath) { Remove-Item$LocalTempPath -Recurse -Force }
    New-Item -ItemType Directory -Path $LocalTempPath -Force | Out-Null
    Copy-Item -Path "$NetworkFolder\*" -Destination $LocalTempPath -Recurse -Force

    $LocalInfFile = (Get-ChildItem -Path$LocalTempPath -Filter "*.inf" | Select-Object -First 1).FullName

    Write-Host "4. Импорт в DriverStore через pnputil..." -ForegroundColor Cyan
    pnputil.exe /add-driver "$LocalInfFile" /install

    Write-Host "5. Регистрация драйвера через printui.dll (без зависания)..." -ForegroundColor Cyan
    
    # Флаги printui: /ia - Install Driver, /m - Driver Name, /f - INF file path, /h "x64"
    $printuiArgs = "/ia /m `"$TargetDriverKey`" /f `"$LocalInfFile`" /h `"x64`""
    
    $process = Start-Process -FilePath "rundll32.exe" -ArgumentList "printui.dll,PrintUIEntry $printuiArgs" -Wait -PassThru -NoNewWindow

    if ($process.ExitCode -eq 0) {
        Write-Host "УСПЕХ! Драйвер '$TargetDriverKey' успешно зарегистрирован!" -ForegroundColor Green
    } else {
        Write-Warning "printui завершился с кодом: $($process.ExitCode). Проверяем наличие драйвера в системе..."
    }

    # Проверка
    Get-PrinterDriver -Name $TargetDriverKey -ErrorAction SilentlyContinue

}
catch {
    Write-Error "Ошибка: $_"
}
finally {
    if (Test-Path $LocalTempPath) {
        Remove-Item $LocalTempPath -Recurse -Force -ErrorAction SilentlyContinue
    }
}