diff --git a/DEPLOY.md b/DEPLOY.md index 6dfb711..6c9c36e 100644 --- a/DEPLOY.md +++ b/DEPLOY.md @@ -34,6 +34,34 @@ Лог установки: **`C:\ProgramData\RDP-login-monitor\Logs\deploy.log`**. +## Задачи планировщика после `-InstallTasks` + +Параметр **`Login_Monitor.ps1 -InstallTasks`** создаёт две задачи: + +| Имя | Назначение | +|-----|------------| +| **`RDP-Login-Monitor`** | Запуск основного монитора при старте ОС (`Register-ScheduledTask`, триггер «При запуске компьютера»). | +| **`RDP-Login-Monitor-Watchdog`** | Тот же файл **`Login_Monitor.ps1`** с аргументом **`-Watchdog`**: короткая проверка «жив ли монитор», при необходимости поднимает процесс. | + +Watchdog регистрируется через **`schtasks.exe /Create /SC MINUTE /MO 5`** (а не через CIM-триггеры PowerShell): на части ОС у объектов триггера нет настраиваемых **`RepetitionInterval`** / длительность «раз и навсегда» режется планировщиком — из‑за этого раньше вторая задача могла не создаваться. + +Перед созданием выполняется **`schtasks /Delete … /F`** (если задачи ещё не было, сообщение об ошибке подавляется — это нормально). + +Сразу после успешного **`/Create`** вызывается **`schtasks /Run`** для watchdog: первый прогон не ждёт следующего 5‑минутного окна расписания. + +Проверка: + +```powershell +Get-ScheduledTask -TaskName 'RDP-Login-Monitor','RDP-Login-Monitor-Watchdog' -ErrorAction SilentlyContinue +schtasks /Query /TN "RDP-Login-Monitor-Watchdog" +``` + +Логи: **`...\Logs\login_monitor.log`**, **`...\Logs\watchdog.log`**. + +## Запуск Deploy и политики с файловой шары + +Если при запуске **`Deploy-LoginMonitor.ps1`** или **`Login_Monitor.ps1`** с UNC по **FQDN** (`\\dc.domain.local\...`) PowerShell сообщает про **цифровую подпись** / политику выполнения, чаще всего помогает путь по **короткому имени** контроллера: **`\\DC01\NETLOGON\...`** (клиент относит UNC к интрасети иначе). Параллельно убедитесь, что команда реально с **`powershell.exe -ExecutionPolicy Bypass -File "..."`**. + ## Версии: `version.txt` и `$ScriptVersion` | Что | Роль | diff --git a/Login_Monitor.ps1 b/Login_Monitor.ps1 index f143283..3c03199 100644 --- a/Login_Monitor.ps1 +++ b/Login_Monitor.ps1 @@ -69,7 +69,7 @@ $script:RdpInstanceMutex = $null # строки ниже, если правки «мелкие» и вы не хотите менять отображаемую версию в логах). # Рекомендация: при значимых релизах меняйте и $ScriptVersion, и version.txt одинаково; при только # исправлениях на шаре — достаточно поднять patch в version.txt (например 1.3.0.1). -$ScriptVersion = "1.3.0" +$ScriptVersion = "1.3.4" # Логи (все под InstallRoot) $LogFile = Join-Path $script:InstallRoot "Logs\login_monitor.log" @@ -304,6 +304,7 @@ function Test-RdpMonitorScheduledTaskMatches { } function Register-RdpMonitorScheduledTasksCore { + Write-Log "Register-RdpMonitorScheduledTasksCore: ветка v$ScriptVersion (watchdog через schtasks /SC MINUTE, без CIM RepetitionInterval)." $psExe = Get-RdpMonitorPowerShellExe $canonicalScript = [System.IO.Path]::GetFullPath((Join-Path $script:InstallRoot $script:CanonicalScriptName)) if (-not (Test-Path -LiteralPath $canonicalScript)) { @@ -323,14 +324,37 @@ function Register-RdpMonitorScheduledTasksCore { -Principal $principal -Settings $settings -Force | Out-Null Write-Log "Задача планировщика: $($script:ScheduledTaskNameMain) (запуск при старте ОС)." - $actionWd = New-ScheduledTaskAction -Execute $psExe -Argument $argWd - $trigger2 = New-ScheduledTaskTrigger -Once -At (Get-Date) - $trigger2.RepetitionInterval = New-TimeSpan -Minutes 5 - $trigger2.RepetitionDuration = New-TimeSpan -Days 36500 + # Watchdog только через schtasks. /Delete при отсутствии задачи пишет в stderr — при $ErrorActionPreference Stop раньше рвал скрипт. + $schtasksExe = Join-Path $env:SystemRoot 'System32\schtasks.exe' + $delErrAction = $ErrorActionPreference + try { + $ErrorActionPreference = 'SilentlyContinue' + & $schtasksExe /Delete /TN $script:ScheduledTaskNameWatchdog /F 2>$null | Out-Null + } finally { + $ErrorActionPreference = $delErrAction + } - Register-ScheduledTask -TaskName $script:ScheduledTaskNameWatchdog -Action $actionWd -Trigger $trigger2 ` - -Principal $principal -Settings $settings -Force | Out-Null - Write-Log "Задача планировщика: $($script:ScheduledTaskNameWatchdog) (каждые 5 минут, контроль процесса)." + $trForSch = "`"$psExe`" $argWd" + $schOut = & $schtasksExe /Create /F /RU SYSTEM /RL HIGHEST /SC MINUTE /MO 5 /TN $script:ScheduledTaskNameWatchdog /TR $trForSch 2>&1 + foreach ($line in @($schOut)) { + Write-Log "schtasks watchdog: $line" + } + Write-Log "Задача планировщика: $($script:ScheduledTaskNameWatchdog) (schtasks, каждые 5 минут, контроль процесса)." + + # Первый запуск по расписанию может быть почти через 5 мин — сразу ставим одноразовый прогон в очередь. + $runEa = $ErrorActionPreference + try { + $ErrorActionPreference = 'SilentlyContinue' + $runOut = & $schtasksExe /Run /TN $script:ScheduledTaskNameWatchdog 2>&1 + foreach ($line in @($runOut)) { + if ($null -ne $line -and "$line".Trim().Length -gt 0) { + Write-Log "schtasks watchdog /Run: $line" + } + } + } finally { + $ErrorActionPreference = $runEa + } + Write-Log "Немедленный прогон watchdog запрошен (schtasks /Run)." } function Ensure-RdpMonitorScheduledTasks { diff --git a/README.md b/README.md index 1471f13..18db31b 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ PowerShell-набор для мониторинга входов в Windows с ## Актуальная схема (рекомендуется) -- **`Login_Monitor.ps1`** — единый монитор: журнал Security (`4624`/`4625`), при необходимости RD Gateway (`302`/`303`), рабочие станции и серверы, ротация логов, heartbeat, отчёты. Устанавливается в **`C:\ProgramData\RDP-login-monitor\`**, задачи **`RDP-Login-Monitor`** и **`RDP-Login-Monitor-Watchdog`** создаются параметром **`-InstallTasks`** (встроено в скрипт). +- **`Login_Monitor.ps1`** — единый монитор: журнал Security (`4624`/`4625`), при необходимости RD Gateway (`302`/`303`), рабочие станции и серверы, ротация логов, heartbeat, отчёты. Устанавливается в **`C:\ProgramData\RDP-login-monitor\`**, задачи **`RDP-Login-Monitor`** и **`RDP-Login-Monitor-Watchdog`** создаются параметром **`-InstallTasks`** (watchdog через **`schtasks`**, см. **DEPLOY.md**). - **`Deploy-LoginMonitor.ps1`** + **`version.txt`** — доставка с файловой шары по версии (домен, GPO «автозагрузка» компьютера). Подробности, структура шары и правила версий: **[DEPLOY.md](DEPLOY.md)**. - **`Encrypt-DpapiForRdpMonitor.ps1`** — опционально, для DPAPI-строк токена/chat id на конкретном ПК. diff --git a/version.txt b/version.txt index f0bb29e..d0149fe 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.3.0 +1.3.4