Fix auditpol for RU subcategory and safer stderr handling

This commit is contained in:
Луценко Андрей Анатольевич
2026-04-11 21:48:49 +10:00
parent 16baf12094
commit d0171daf8e
+68 -9
View File
@@ -178,18 +178,77 @@ Write-Log "Скрипт запущен с правами администрат
function Enable-SecurityAudit { function Enable-SecurityAudit {
Write-Log "Проверка настроек аудита..." Write-Log "Проверка настроек аудита..."
$auditPolicy = auditpol /get /subcategory:"Logon" 2>$null
if ($auditPolicy -like "*Success*Failure*") { # Важно: auditpol пишет часть сообщений в stderr. Если перенаправлять stderr в $null,
Write-Log "Аудит входа уже настроен" # PowerShell может превратить это в завершающую ошибку (и скрипт упадёт из-за $ErrorActionPreference=Stop).
function Invoke-AuditPol {
param([Parameter(Mandatory = $true)][string]$Arguments)
$cmd = "auditpol $Arguments 2>&1"
$text = cmd.exe /c $cmd
$code = $LASTEXITCODE
return [pscustomobject]@{
ExitCode = $code
Text = ($text | Out-String).Trim()
}
}
function Test-LogonAuditEnabled {
# На русской Windows подкатегория называется "Вход в систему", а не "Logon".
# В выводе auditpol обычно встречаются слова "успех" и "отказ" (или Success/Failure).
$candidates = @(
'/get /subcategory:"Вход в систему"',
'/get /subcategory:"Logon"'
)
foreach ($args in $candidates) {
$r = Invoke-AuditPol -Arguments $args
if ($r.ExitCode -ne 0) {
Write-Log ("Не удалось прочитать auditpol (код {0}) для: {1}. Вывод:`n{2}" -f $r.ExitCode, $args.Trim(), $r.Text)
continue
}
$t = $r.Text
if (($t -match '(?i)Success') -and ($t -match '(?i)Failure')) { return $true }
if (($t -match '(?i)успех') -and ($t -match '(?i)отказ')) { return $true }
}
return $false
}
if (Test-LogonAuditEnabled) {
Write-Log "Аудит входа уже настроен (Success+Failure)"
return
}
Write-Log "Аудит входа не настроен полностью. Пытаюсь включить..."
# Порядок попыток: от самого "каноничного" к более совместимому.
$attempts = @(
# RU Windows (как в вашем выводе auditpol /list /subcategory:*)
'/set /subcategory:"Вход в систему" /success:enable /failure:enable',
'/set /category:"Вход/выход" /success:enable /failure:enable',
# EN Windows
'/set /subcategory:"Logon" /success:enable /failure:enable',
'/set /category:"Logon/Logoff" /success:enable /failure:enable',
# GUID категории (как было у вас изначально)
'/set /category:"{69979849-797A-11D9-BED3-505054503030}" /success:enable /failure:enable'
)
foreach ($a in $attempts) {
$r = Invoke-AuditPol -Arguments $a
if ($r.ExitCode -eq 0) {
Write-Log ("auditpol OK: {0}" -f $a.Trim())
} else { } else {
Write-Log "Включение аудита входа..." Write-Log ("auditpol FAIL (код {0}): {1}`n{2}" -f $r.ExitCode, $a.Trim(), $r.Text)
try { }
auditpol /set /category:"{69979849-797A-11D9-BED3-505054503030}" /success:enable /failure:enable
Write-Log "Аудит входа успешно включен" if (Test-LogonAuditEnabled) {
} catch { Write-Log "Аудит входа успешно включен (Success+Failure)"
Write-Log "Ошибка включения аудита: $($_.Exception.Message)" return
} }
} }
Write-Log "ВНИМАНИЕ: не удалось автоматически включить аудит входа через auditpol. Скрипт продолжит работу, но часть событий может отсутствовать. Проверьте политику аудита вручную (локальная/доменная GPO)."
} }
function Send-Heartbeat { function Send-Heartbeat {