diff --git a/DEPLOY.md b/DEPLOY.md index fbe6490..8df9cb6 100644 --- a/DEPLOY.md +++ b/DEPLOY.md @@ -122,6 +122,32 @@ schtasks /Query /TN "RDP-Login-Monitor-Watchdog" - `RDP-Login-Monitor-Watchdog` - Поэтому после фактического запуска deploy монитор и watchdog стартуют сразу. +### Серверы без перезагрузок: периодический Deploy + +Если сервер перезагружается редко, одного Startup-сценария недостаточно для своевременного обновления. В этом случае добавьте отдельную задачу, которая периодически запускает `Deploy-LoginMonitor.ps1` с шары. + +Готовый скрипт в репозитории: + +- `Install-DeployScheduledTask.ps1` + +Пример (каждые 60 минут и сразу запустить): + +```powershell +powershell.exe -NoProfile -ExecutionPolicy Bypass -File ".\Install-DeployScheduledTask.ps1" ` + -TaskName "RDP-Login-Monitor-Deploy" ` + -DeployScriptPath "\\B26\NETLOGON\RDP-login-monitor\Deploy-LoginMonitor.ps1" ` + -RepeatMinutes 60 ` + -RunNow +``` + +Проверка: + +```powershell +schtasks /Query /TN "RDP-Login-Monitor-Deploy" /V /FO LIST +``` + +Важно: эта задача отвечает только за доставку обновлений (через `version.txt`). За «живость» процесса по-прежнему отвечает `RDP-Login-Monitor-Watchdog`. + ### Диагностика GPO/Startup - События применения политики и startup-сценариев: diff --git a/Install-DeployScheduledTask.ps1 b/Install-DeployScheduledTask.ps1 new file mode 100644 index 0000000..c3a5549 --- /dev/null +++ b/Install-DeployScheduledTask.ps1 @@ -0,0 +1,45 @@ +#Requires -RunAsAdministrator +[CmdletBinding()] +param( + [string]$TaskName = "RDP-Login-Monitor-Deploy", + [string]$DeployScriptPath = "\\B26\NETLOGON\RDP-login-monitor\Deploy-LoginMonitor.ps1", + [ValidateRange(5, 1440)][int]$RepeatMinutes = 60, + [switch]$RunNow +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = "Stop" + +if ([string]::IsNullOrWhiteSpace($DeployScriptPath)) { + throw "DeployScriptPath не задан." +} + +$psExe = "$env:SystemRoot\System32\WindowsPowerShell\v1.0\powershell.exe" +if (-not (Test-Path -LiteralPath $psExe)) { + throw "Не найден powershell.exe по пути: $psExe" +} + +$taskCmd = "`"$psExe`" -NoProfile -ExecutionPolicy Bypass -File `"$DeployScriptPath`"" +$schtasksExe = Join-Path $env:SystemRoot "System32\schtasks.exe" + +Write-Host "Создаю/обновляю задачу: $TaskName" -ForegroundColor Cyan +Write-Host "Команда: $taskCmd" -ForegroundColor DarkGray +Write-Host "Периодичность: каждые $RepeatMinutes мин." -ForegroundColor DarkGray + +& $schtasksExe /Create /F /TN $TaskName /RU SYSTEM /RL HIGHEST /SC MINUTE /MO $RepeatMinutes /TR $taskCmd | Out-Host + +if ($LASTEXITCODE -ne 0) { + throw "schtasks /Create вернул код $LASTEXITCODE" +} + +Write-Host "Задача создана/обновлена: $TaskName" -ForegroundColor Green + +if ($RunNow) { + Write-Host "Запускаю задачу немедленно..." -ForegroundColor Cyan + & $schtasksExe /Run /TN $TaskName | Out-Host + if ($LASTEXITCODE -ne 0) { + throw "schtasks /Run вернул код $LASTEXITCODE" + } +} + +Write-Host "Готово." -ForegroundColor Green