feat: daily report agent version line and per-line active users (1.2.28-SAC)

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
PTah
2026-05-31 11:28:29 +10:00
parent e738d97c9c
commit b56ad9c7e4
3 changed files with 21 additions and 4 deletions
+19 -2
View File
@@ -80,7 +80,7 @@ $script:MonitorLoopInitialized = $false
# строки ниже, если правки «мелкие» и вы не хотите менять отображаемую версию в логах). # строки ниже, если правки «мелкие» и вы не хотите менять отображаемую версию в логах).
# Рекомендация: при значимых релизах меняйте и $ScriptVersion, и version.txt одинаково; при только # Рекомендация: при значимых релизах меняйте и $ScriptVersion, и version.txt одинаково; при только
# исправлениях на шаре — достаточно поднять patch в version.txt (например 1.3.0.1). # исправлениях на шаре — достаточно поднять patch в version.txt (например 1.3.0.1).
$ScriptVersion = "1.2.27-SAC" $ScriptVersion = "1.2.28-SAC"
# Логи (все под InstallRoot) # Логи (все под InstallRoot)
$LogFile = Join-Path $script:InstallRoot "Logs\login_monitor.log" $LogFile = Join-Path $script:InstallRoot "Logs\login_monitor.log"
@@ -1638,6 +1638,22 @@ function Get-DailyReportAuthStats24h {
} }
} }
function Expand-DailyReportActiveUserEntries {
param([string[]]$Entries)
$out = [System.Collections.Generic.List[string]]::new()
foreach ($e in @($Entries)) {
if ([string]::IsNullOrWhiteSpace($e)) { continue }
$parts = [regex]::Split($e.Trim(), '(?=👤)')
foreach ($p in $parts) {
$p = $p.Trim()
if ([string]::IsNullOrWhiteSpace($p)) { continue }
if (-not $p.StartsWith('👤')) { $p = "👤 $p" }
[void]$out.Add($p)
}
}
return ,@($out)
}
function Get-DailyReportActiveUsersFromQuser { function Get-DailyReportActiveUsersFromQuser {
$lines = [System.Collections.Generic.List[string]]::new() $lines = [System.Collections.Generic.List[string]]::new()
$quserExe = Join-Path $env:SystemRoot 'System32\quser.exe' $quserExe = Join-Path $env:SystemRoot 'System32\quser.exe'
@@ -1674,6 +1690,7 @@ function Build-DailyReportPlainBodyWindows {
$top = @($Stats.top_failed_ips) $top = @($Stats.top_failed_ips)
$sb = [System.Text.StringBuilder]::new() $sb = [System.Text.StringBuilder]::new()
[void]$sb.AppendLine('📊 ЕЖЕДНЕВНЫЙ ОТЧЕТ МОНИТОРИНГА WINDOWS') [void]$sb.AppendLine('📊 ЕЖЕДНЕВНЫЙ ОТЧЕТ МОНИТОРИНГА WINDOWS')
[void]$sb.AppendLine("Agent version $ScriptVersion")
[void]$sb.AppendLine("🖥️ Сервер: $server") [void]$sb.AppendLine("🖥️ Сервер: $server")
[void]$sb.AppendLine("🕐 Время отчета: $timeStr") [void]$sb.AppendLine("🕐 Время отчета: $timeStr")
[void]$sb.AppendLine('') [void]$sb.AppendLine('')
@@ -2809,7 +2826,7 @@ function Send-DailyReport {
try { try {
$reportTime = Get-Date $reportTime = Get-Date
$stats = Get-DailyReportAuthStats24h $stats = Get-DailyReportAuthStats24h
$activeUsers = @(Get-DailyReportActiveUsersFromQuser) $activeUsers = Expand-DailyReportActiveUserEntries -Entries @(Get-DailyReportActiveUsersFromQuser)
$plainBody = Build-DailyReportPlainBodyWindows -Stats $stats -ActiveUsers $activeUsers -ReportTime $reportTime $plainBody = Build-DailyReportPlainBodyWindows -Stats $stats -ActiveUsers $activeUsers -ReportTime $reportTime
$telegramMessage = Convert-DailyReportPlainToTelegramHtml -PlainBody $plainBody $telegramMessage = Convert-DailyReportPlainToTelegramHtml -PlainBody $plainBody
+1 -1
View File
@@ -13,7 +13,7 @@ PowerShell-набор для мониторинга входов в Windows с
- Документация по развёртыванию: **[Docs/README.md](Docs/README.md)** (RDP-монитор, Exchange, NETLOGON). - Документация по развёртыванию: **[Docs/README.md](Docs/README.md)** (RDP-монитор, Exchange, NETLOGON).
- **`Encrypt-DpapiForRdpMonitor.ps1`** — опционально для подготовки DPAPI-строк токена/chat id и пароля SMTP (`$MailSmtpPasswordProtectedB64` в файле настроек). - **`Encrypt-DpapiForRdpMonitor.ps1`** — опционально для подготовки DPAPI-строк токена/chat id и пароля SMTP (`$MailSmtpPasswordProtectedB64` в файле настроек).
- **Локальные настройки RDP-монитора:** **`login_monitor.settings.ps1`** в каталоге установки (образец **`login_monitor.settings.example.ps1`**). При автообновлении **`Login_Monitor.ps1`** с шары файл настроек **не перезаписывается** (как **`exchange_monitor.settings.ps1`** для Exchange). - **Локальные настройки RDP-монитора:** **`login_monitor.settings.ps1`** в каталоге установки (образец **`login_monitor.settings.example.ps1`**). При автообновлении **`Login_Monitor.ps1`** с шары файл настроек **не перезаписывается** (как **`exchange_monitor.settings.ps1`** для Exchange).
- **Security Alert Center (SAC):** модуль **`Sac-Client.ps1`** (копируется вместе с `Login_Monitor.ps1`). Режимы **`$UseSAC`**: `off` | `exclusive` | `dual` | `fallback` — контракт в репозитории **security-alert-center** (`docs/agent-integration.md`). Версия релиза: **`$ScriptVersion`** и **`version.txt`** (сейчас **1.2.27-SAC**); **`Sac-Client.ps1`** передаёт ту же версию в SAC (`product_version`). - **Security Alert Center (SAC):** модуль **`Sac-Client.ps1`** (копируется вместе с `Login_Monitor.ps1`). Режимы **`$UseSAC`**: `off` | `exclusive` | `dual` | `fallback` — контракт в репозитории **security-alert-center** (`docs/agent-integration.md`). Версия релиза: **`$ScriptVersion`** и **`version.txt`** (сейчас **1.2.28-SAC**); **`Sac-Client.ps1`** передаёт ту же версию в SAC (`product_version`).
## Что изменилось (важное) ## Что изменилось (важное)
+1 -1
View File
@@ -1 +1 @@
1.2.27-SAC 1.2.28-SAC