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


# =====================================================
# ПОЛНАЯ АВТОМАТИЗАЦИЯ УСТАНОВКИ ЭЦП ПРЕДСЕДАТЕЛЯ
# Версия 3: с использованием csptest для регистрации контейнера
# =====================================================

# === НАСТРОЙКИ ===
$ServerShare = "\\10.0.2.21\Disk_M\ОБМЕН\fss_ecp"
$NetContainerPath = "$ServerShare\fssrpred.000"
$NetCertPath = "$ServerShare\cert_pred.cer"
$ContainerName = "fssrpred"

# === ЛОКАЛЬНЫЕ ПУТИ ===
$LocalAppData = [Environment]::GetFolderPath("LocalApplicationData")
$CryptoProPath = Join-Path $LocalAppData "Crypto-Pro"
$LocalContainerPath = Join-Path $CryptoProPath $ContainerName
$MarkerFile = Join-Path $LocalAppData "Clinic_Chairman_Deployed_v1.txt"
$LogFile = Join-Path $LocalAppData "Clinic_Chairman_Deploy.log"

# === ФУНКЦИЯ ЛОГИРОВАНИЯ ===
function Write-Log {
    param([string]$Message)
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $logEntry = "$timestamp | $env:COMPUTERNAME | $env:USERNAME | $Message"
    try {
        Add-Content -Path $LogFile -Value $logEntry -ErrorAction Stop
    } catch {}
}

# === ПРОВЕРКА: УЖЕ УСТАНОВЛЕНО? ===
if (Test-Path $MarkerFile) {
    Write-Log "Маркер найден - установка уже выполнена. Выход."
    Exit
}

Write-Log "=== НАЧАЛО УСТАНОВКИ ==="
Write-Log "Контейнер: $ContainerName"
Write-Log "Источник: $NetContainerPath"

# === ШАГ 1: ПРОВЕРКА СЕТЕВЫХ РЕСУРСОВ ===
Write-Log "=== ШАГ 1: Проверка сетевых ресурсов ==="

if (-not (Test-Path $NetContainerPath)) {
    Write-Log "ОШИБКА: Контейнер не найден: $NetContainerPath"
    Exit
}

if (-not (Test-Path $NetCertPath)) {
    Write-Log "ОШИБКА: Сертификат не найден: $NetCertPath"
    Exit
}

Write-Log "Сетевые ресурсы доступны"

# === ШАГ 2: ПОИСК УТИЛИТ КРИПТОПРО ===
Write-Log "=== ШАГ 2: Поиск утилит КриптоПро ==="

$certmgrExe = $null
$csptestExe = $null

$certmgrPaths = @(
    "C:\Program Files\Crypto Pro\CSP\certmgr.exe",
    "C:\Program Files (x86)\Crypto Pro\CSP\certmgr.exe"
)

$csptestPaths = @(
    "C:\Program Files\Crypto Pro\CSP\csptest.exe",
    "C:\Program Files (x86)\Crypto Pro\CSP\csptest.exe"
)

foreach ($path in $certmgrPaths) {
    if (Test-Path $path) {
        $certmgrExe = $path
        Write-Log "Найден certmgr.exe: $path"
        break
    }
}

foreach ($path in $csptestPaths) {
    if (Test-Path $path) {
        $csptestExe = $path
        Write-Log "Найден csptest.exe: $path"
        break
    }
}

if (-not $certmgrExe -or -not $csptestExe) {
    Write-Log "ОШИБКА: Утилиты КриптоПро не найдены!"
    Exit
}

# === ШАГ 3: КОПИРОВАНИЕ КОНТЕЙНЕРА В ПРАВИЛЬНУЮ ПАПКУ HDIMAGE ===
Write-Log "=== ШАГ 3: Копирование контейнера в HDIMAGE ==="

try {
    # Создаем папку Crypto-Pro (с дефисом!) если нет
    if (-not (Test-Path $CryptoProPath)) {
        New-Item -Path $CryptoProPath -ItemType Directory -Force | Out-Null
        Write-Log "Создана папка: $CryptoProPath"
    }
    
    # Создаем папку контейнера (без .000!)
    if (-not (Test-Path $LocalContainerPath)) {
        New-Item -Path $LocalContainerPath -ItemType Directory -Force | Out-Null
        Write-Log "Создана папка контейнера: $LocalContainerPath"
    }
    
    # Копируем файлы из fssrpred.000 в fssrpred
    Write-Log "Копирование файлов из $NetContainerPath в $LocalContainerPath"
    Copy-Item -Path "$NetContainerPath\*" -Destination $LocalContainerPath -Force -Recurse
    
    $filesCount = (Get-ChildItem -Path $LocalContainerPath -File).Count
    Write-Log "Контейнер скопирован (файлов: $filesCount)"
    
    if ($filesCount -eq 0) {
        Write-Log "ОШИБКА: Файлы не скопировались"
        Exit
    }
    
} catch {
    Write-Log "ОШИБКА копирования: $_"
    Exit
}

# === ШАГ 4: РЕГИСТРАЦИЯ КОНТЕЙНЕРА ЧЕРЕЗ CSPTTEST ===
Write-Log "=== ШАГ 4: Регистрация контейнера через csptest ==="

try {
    # Путь к исходному контейнеру (в HDIMAGE)
    $contSrc = "\\.\HDIMAGE\$ContainerName"
    Write-Log "Исходный контейнер: $contSrc"
    
    # Используем csptest -keycopy для копирования контейнера с регистрацией
    # Это правильно регистрирует контейнер в реестре КриптоПро
    Write-Log "Копирование контейнера с регистрацией..."
    $output = & $csptestExe -keycopy -contsrc $contSrc -contdest $contSrc -keysout 2>&1
    $outputStr = $output | Out-String
    Write-Log "Результат csptest -keycopy:"
    Write-Log $outputStr
    
    # Проверяем, что контейнер зарегистрировался
    Start-Sleep -Seconds 2
    $checkOutput = & $certmgrExe -list -store uMy 2>&1 | Select-String -Pattern $ContainerName
    if ($checkOutput) {
        Write-Log "Контейнер УСПЕШНО зарегистрирован в КриптоПро"
    } else {
        Write-Log "ВНИМАНИЕ: Контейнер может быть не зарегистрирован"
    }
    
} catch {
    Write-Log "ОШИБКА регистрации через csptest: $_"
}

# === ШАГ 5: УСТАНОВКА СЕРТИФИКАТА ИЗ КОНТЕЙНЕРА ===
Write-Log "=== ШАГ 5: Установка сертификата из контейнера ==="

try {
    $contPath = "\\.\HDIMAGE\$ContainerName"
    Write-Log "Установка сертификата из контейнера: $contPath"
    
    $output = & $certmgrExe -inst -cont $contPath -store uMy 2>&1
    $outputStr = $output | Out-String
    Write-Log "Результат установки сертификата:"
    Write-Log $outputStr
    
} catch {
    Write-Log "ОШИБКА установки сертификата: $_"
}

# === ШАГ 6: ИМПОРТ СЕРТИФИКАТА ИЗ ФАЙЛА (ДЛЯ НАДЕЖНОСТИ) ===
Write-Log "=== ШАГ 6: Импорт сертификата из файла ==="

try {
    Write-Log "Импорт сертификата через certutil.exe..."
    $output = & certutil.exe -user -addstore "My" $NetCertPath 2>&1
    $outputStr = $output | Out-String
    Write-Log "Результат импорта:"
    Write-Log $outputStr
    
    # Проверяем наличие сертификата
    $cert = Get-ChildItem -Path "Cert:\CurrentUser\My" | 
            Where-Object { $_.NotAfter -gt (Get-Date) } |
            Select-Object -First 1
    
    if ($cert) {
        Write-Log "Сертификат установлен: $($cert.Subject)"
        Write-Log "Отпечаток: $($cert.Thumbprint)"
    } else {
        Write-Log "ВНИМАНИЕ: Сертификат не найден в хранилище"
    }
    
} catch {
    Write-Log "ОШИБКА импорта сертификата: $_"
}

# === ШАГ 7: ПРОВЕРКА РЕЗУЛЬТАТОВ ===
Write-Log "=== ШАГ 7: Проверка результатов ==="

if (Test-Path $LocalContainerPath) {
    $filesCount = (Get-ChildItem -Path $LocalContainerPath -File).Count
    Write-Log "Контейнер на диске: OK ($filesCount файлов)"
} else {
    Write-Log "Контейнер на диске: NOT FOUND"
}

try {
    $certCount = (Get-ChildItem -Path "Cert:\CurrentUser\My" -ErrorAction SilentlyContinue).Count
    Write-Log "Сертификатов в хранилище: $certCount"
} catch {
    Write-Log "Не удалось проверить хранилище"
}

# === ШАГ 8: УСТАНОВКА МАРКЕРА ===
Write-Log "=== ШАГ 8: Установка маркера ==="

try {
    New-Item -Path $MarkerFile -ItemType File -Force | Out-Null
    Write-Log "Маркер установлен: $MarkerFile"
    Write-Log "=== УСТАНОВКА ЗАВЕРШЕНА УСПЕШНО ==="
} catch {
    Write-Log "ОШИБКА создания маркера: $_"
}