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


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

# === НАСТРОЙКИ ===
$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

foreach ($path in @("C:\Program Files\Crypto Pro\CSP\certmgr.exe", "C:\Program Files (x86)\Crypto Pro\CSP\certmgr.exe")) {
    if (Test-Path $path) {
        $certmgrExe = $path
        Write-Log "Найден certmgr.exe: $path"
        break
    }
}

foreach ($path in @("C:\Program Files\Crypto Pro\CSP\csptest.exe", "C:\Program Files (x86)\Crypto Pro\CSP\csptest.exe")) {
    if (Test-Path $path) {
        $csptestExe = $path
        Write-Log "Найден csptest.exe: $path"
        break
    }
}

if (-not $certmgrExe) {
    Write-Log "ОШИБКА: certmgr.exe не найден!"
    Exit
}

# === ШАГ 3: КОПИРОВАНИЕ КОНТЕЙНЕРА ===
Write-Log "=== ШАГ 3: Копирование контейнера в 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"
    }
    
    Write-Log "Копирование файлов..."
    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 {
    if ($csptestExe) {
        $contPath = "\\.\HDIMAGE\$ContainerName"
        Write-Log "Регистрация контейнера: $contPath"
        
        # Регистрируем контейнер в реестре КриптоПро
        $output = & $csptestExe -keyset -cont $contPath -instkeyset 2>&1
        $outputStr = $output | Out-String
        Write-Log "Результат регистрации:"
        Write-Log $outputStr
        
        Start-Sleep -Seconds 2
        $checkOutput = & $certmgrExe -list -store uMy 2>&1 | Out-String
        if ($checkOutput -like "*$ContainerName*") {
            Write-Log "Контейнер УСПЕШНО зарегистрирован!"
        } else {
            Write-Log "ВНИМАНИЕ: Контейнер может быть не зарегистрирован"
        }
    } else {
        Write-Log "ОШИБКА: csptest.exe не найден"
    }
    
} catch {
    Write-Log "ОШИБКА регистрации: $_"
}

# === ШАГ 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 "ОШИБКА создания маркера: $_"
}