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


# =====================================================
# ПОЛНАЯ АВТОМАТИЗАЦИЯ УСТАНОВКИ ЭЦП ПРЕДСЕДАТЕЛЯ
# Клиника - автоматическая установка ЭЦП зама по КЭР
# Сервер: 10.0.2.21\Disk_M
# Контейнер: fssrpred
# =====================================================

# === НАСТРОЙКИ ===
$ServerShare = "\\10.0.2.21\Disk_M\ОБМЕН\fss_ecp"
$NetContainerPath = "$ServerShare\fssrpred"
$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 {}
}

# === ПРОВЕРКА: УЖЕ УСТАНОВЛЕНО? ===
Write-Log "Проверка маркера: $MarkerFile"
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: КОПИРОВАНИЕ КОНТЕЙНЕРА В HDIMAGE ===
Write-Log "=== ШАГ 2: Копирование контейнера в HDIMAGE ==="

try {
    if (-not (Test-Path $CryptoProPath)) {
        New-Item -Path $CryptoProPath -ItemType Directory -Force | Out-Null
        Write-Log "Создана папка: $CryptoProPath"
    }
    
    if (-not (Test-Path $LocalContainerPath)) {
        New-Item -Path $LocalContainerPath -ItemType Directory -Force | Out-Null
        Write-Log "Создана папка контейнера: $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
}

# === ШАГ 3: ПОИСК certmgr.exe ОТ КРИПТОПРО ===
Write-Log "=== ШАГ 3: Поиск certmgr.exe ==="

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

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

if (-not $certmgrExe) {
    Write-Log "ОШИБКА: certmgr.exe не найден! Невозможно зарегистрировать контейнер."
    Exit
}

# === ШАГ 4: РЕГИСТРАЦИЯ КОНТЕЙНЕРА И УСТАНОВКА СЕРТИФИКАТА ===
Write-Log "=== ШАГ 4: Регистрация контейнера и установка сертификата ==="

try {
    # Путь к контейнеру в формате КриптоПро
    $contPath = "\\.\HDIMAGE\$ContainerName"
    Write-Log "Путь к контейнеру: $contPath"
    
    # Устанавливаем сертификат из контейнера (это автоматически регистрирует контейнер и связывает с сертификатом)
    Write-Log "Установка сертификата из контейнера..."
    $output = & $certmgrExe -inst -cont $contPath -store uMy 2>&1
    $outputStr = $output | Out-String
    Write-Log "Результат установки:"
    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 "ОШИБКА регистрации: $_"
}

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

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 "ОШИБКА импорта сертификата: $_"
}

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

# Проверяем контейнер
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 "Не удалось проверить хранилище"
}

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

try {
    New-Item -Path $MarkerFile -ItemType File -Force | Out-Null
    Write-Log "Маркер установлен: $MarkerFile"
    Write-Log "=== УСТАНОВКА ЗАВЕРШЕНА УСПЕШНО ==="
    Write-Log ""
    Write-Log "Следующие шаги:"
    Write-Log "1. Откройте КриптоПро CSP"
    Write-Log "2. Сервис → Просмотреть сертификаты в контейнере"
    Write-Log "3. Выберите контейнер: $ContainerName"
    Write-Log "4. Проверьте отображение сертификата"
    Write-Log "5. Откройте МИС и проверьте подпись"
} catch {
    Write-Log "ОШИБКА создания маркера: $_"
}