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


<#
.SYNOPSIS
    Установка драйвера печати с принт-сервера на RDP-сервер
#>

# --- НАСТРОЙКИ ---
$PrintServer = "PrintServer01"
$DriverSearchPattern = "TASKalfa 3501i"
$LocalTempPath = "C:\Temp\PrinterDriver"
# -----------------

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

    Write-Host "2. Получение данных о драйвере с принт-сервера через WMI..." -ForegroundColor Cyan
    $HKLM = [uint32]2147483650$WmiReg = [WMIClass]"\\$PrintServer\root\default:StdRegProv"
    
    $DriversKey = "SYSTEM\CurrentControlSet\Control\Print\Environments\Windows x64\Drivers\Version-3"
    $EnumResult =$WmiReg.EnumKey($HKLM,$DriversKey)
    $SubKeys =$EnumResult.sNames

    $TargetDriverKey =$SubKeys | Where-Object { $_ -like "*$DriverSearchPattern*" } | Select-Object -First 1

    if (-not $TargetDriverKey) {
        throw "Драйвер, содержащий '$DriverSearchPattern', не найден в реестре сервера $PrintServer."
    }

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

    # Читаем путь к файлу из реестра
    $RegValueResult =$WmiReg.GetStringValue($HKLM, "$DriversKey\$TargetDriverKey", "InfPath")
    $InfPathOnServer =$RegValueResult.sValue

    if (-not $InfPathOnServer) {
        $RegValueResult =$WmiReg.GetStringValue($HKLM, "$DriversKey\$TargetDriverKey", "ConfigFile")
        $InfPathOnServer =$RegValueResult.sValue
    }

    if (-not $InfPathOnServer) {
        throw "Не удалось получить путь к файлам драйвера с сервера $PrintServer."
    }

    # Получаем родительскую папку
    $ServerFolder = Split-Path -Path$InfPathOnServer -Parent

    # Формируем сетевой путь через C$
    $DriveLetter =$ServerFolder.Substring(0, 1)
    $PathWithoutDrive =$ServerFolder.Substring(3)
    $NetworkFolder = "\\$PrintServer\" + $DriveLetter + "`$\" + $PathWithoutDrive

    Write-Host "Сетевая папка источника: $NetworkFolder" -ForegroundColor Yellow

    Write-Host "3. Подготовка локальной папки на RDP..." -ForegroundColor Cyan
    if (Test-Path -Path $LocalTempPath) { 
        Remove-Item -Path $LocalTempPath -Recurse -Force 
    }
    New-Item -ItemType Directory -Path $LocalTempPath -Force | Out-Null

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

    Write-Host "5. Поиск INF-файлов..." -ForegroundColor Cyan
    $InfFiles = Get-ChildItem -Path$LocalTempPath -Filter "*.inf" -Recurse

    if ($InfFiles.Count -eq 0) {
        throw "Ни одного .inf файла не найдено в скопированной папке '$LocalTempPath'."
    }

    $TargetInf =$InfFiles | Where-Object { 
        $content = Get-Content -Path$_.FullName -Raw -ErrorAction SilentlyContinue
        $content -match$DriverSearchPattern 
    } | Select-Object -First 1

    if (-not $TargetInf) {
        $TargetInf =$InfFiles[0]
    }

    $LocalInfFile =$TargetInf.FullName
    Write-Host "Используется INF-файл: $LocalInfFile" -ForegroundColor Green

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

    Write-Host "7. Регистрация драйвера через printui.dll..." -ForegroundColor Cyan
    $printuiArgs = "/ia /m `"$TargetDriverKey`" /f `"$LocalInfFile`" /h `"x64`""
    
    $process = Start-Process -FilePath "rundll32.exe" -ArgumentList "printui.dll,PrintUIEntry $printuiArgs" -Wait -PassThru -NoNewWindow

    Write-Host "8. Проверка зарегистрированного драйвера:" -ForegroundColor Cyan
    Get-PrinterDriver -Name $TargetDriverKey -ErrorAction SilentlyContinue

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