Загрузка данных
# =====================================================
# ПОЛНАЯ АВТОМАТИЗАЦИЯ УСТАНОВКИ ЭЦП ПРЕДСЕДАТЕЛЯ
# Клиника - автоматическая установка ЭЦП зама по КЭР
# Сервер: 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
$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
}
# === ШАГ 3: КОПИРОВАНИЕ КОНТЕЙНЕРА ===
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"
}
# Копируем файлы
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: РЕГИСТРАЦИЯ КОНТЕЙНЕРА ЧЕРЕЗ CERTMGR ===
Write-Log "=== ШАГ 4: Регистрация контейнера через certmgr ==="
try {
# Находим файл .key для регистрации
$keyFile = Get-ChildItem -Path $LocalContainerPath -Filter "*.key" | Select-Object -First 1
if ($keyFile) {
Write-Log "Используем файл: $($keyFile.FullName)"
# Регистрируем контейнер через certmgr -inst -file
$output = & $certmgrExe -inst -file $keyFile.FullName -store uMy -keyset $ContainerName 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 "ВНИМАНИЕ: Контейнер может быть не зарегистрирован"
}
} else {
Write-Log "ОШИБКА: Файлы .key не найдены"
}
} 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 "ОШИБКА создания маркера: $_"
}