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


<#
.SYNOPSIS
    Надежная установка драйвера печати без повисаний (без использования WinRM)
#>

# --- НАСТРОЙКИ ---
$PrintServer = "PrintServer01"

# ЧАСТЬ имени драйвера для поиска в реестре принт-сервера (например, "TASKalfa 3501i" или "Kyocera")
$DriverSearchPattern = "TASKalfa 3501i"

$LocalTempPath = "C:\Temp\PrinterDriver"
# -----------------

try {
    Write-Host "1. Подключение к реестру принт-сервера через WMI..." -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 "Не удалось найти драйвер, содержащий '$DriverSearchPattern', в реестре сервера $PrintServer."
    }

    Write-Host "Найден драйвер в реестре: $TargetDriverKey" -ForegroundColor Green

    # Читаем путь к InfPath
    $RegKeyPath = "$DriversKey\$TargetDriverKey"
    $InfPathOnServer = ($WmiReg.GetStringValue($HKLM, $RegKeyPath, "InfPath")).sValue

    # Формируем сетевой путь через C$
    $ServerDriverFolder = Split-Path $InfPathOnServer -Parent
    $NetworkDriverFolder = "\\$PrintServer\" + ($ServerDriverFolder -replace ':', '$')

    Write-Host "2. Создание локальной папки на RDP-сервере..." -ForegroundColor Cyan
    if (Test-Path $LocalTempPath) { Remove-Item $LocalTempPath -Recurse -Force }
    New-Item -ItemType Directory -Path $LocalTempPath -Force | Out-Null

    Write-Host "3. Копирование файлов драйвера..." -ForegroundColor Cyan
    Copy-Item -Path "$NetworkDriverFolder\*" -Destination $LocalTempPath -Recurse -Force

    # Поиск скопированного INF-файла
    $LocalInfFile = Get-ChildItem -Path $LocalTempPath -Filter "*.inf" | Select-Object -First 1
    if (-not $LocalInfFile) {
        throw "INF-файл не найден в скопированной папке."
    }

    Write-Host "4. Импорт драйвера в DriverStore (pnputil)..." -ForegroundColor Cyan
    $pnpOutput = pnputil.exe /add-driver "$($LocalInfFile.FullName)" /install
    Write-Host $pnpOutput

    Write-Host "5. Извлечение точного имени драйвера из INF-файла..." -ForegroundColor Cyan
    
    # Точное имя драйвера извлекаем с помощью Get-PrinterDriverFromInf
    $InfDriverInfo = Get-PrinterDriverFromInf -InfPath $LocalInfFile.FullName | Where-Object { $_.Name -like "*$DriverSearchPattern*" } | Select-Object -First 1
    
    if (-not $InfDriverInfo) {
        # Если по шаблону не нашли, берем имя первого драйвера из файла
        $InfDriverInfo = Get-PrinterDriverFromInf -InfPath $LocalInfFile.FullName | Select-Object -First 1
    }

    $ExactDriverName = $InfDriverInfo.Name
    Write-Host "Точное имя для регистрации: '$ExactDriverName'" -ForegroundColor Yellow

    Write-Host "6. Регистрация драйвера в система печати..." -ForegroundColor Cyan
    
    # Принудительная установка с явным указанием INF-файла
    Add-PrinterDriver -Name $ExactDriverName -InfPath $LocalInfFile.FullName -ErrorAction Stop

    Write-Host "УСПЕХ! Драйвер '$ExactDriverName' успешно установлен." -ForegroundColor Green

}
catch {
    Write-Error "Ошибка при установке: $_"
}
finally {
    if (Test-Path $LocalTempPath) {
        Write-Host "Очистка временных файлов..." -ForegroundColor Yellow
        Remove-Item -Path $LocalTempPath -Recurse -Force -ErrorAction SilentlyContinue
    }
}