feat: use scheduled task instead of service for user session desktop access

This commit is contained in:
David Piccinini 2026-05-16 16:40:04 -03:00
parent 48a55317cf
commit 56a754309b

View File

@ -131,65 +131,53 @@ LOG_LEVEL=INFO
Write-Host " Config saved to $configFile" -ForegroundColor Green Write-Host " Config saved to $configFile" -ForegroundColor Green
} }
# ── Install as Windows Service via nssm ────────────────────────────────────── # ── Install as Scheduled Task (runs in user session for desktop access) ──────
Write-Host "[5/5] Installing as Windows Service..." -ForegroundColor White Write-Host "[5/5] Installing as Scheduled Task (user session)..." -ForegroundColor White
# Download nssm if not present $TaskName = "EasyBotWindowsAgent"
# Remove old nssm service if present
$nssmPath = "$InstallDir\nssm.exe" $nssmPath = "$InstallDir\nssm.exe"
if (-not (Test-Path $nssmPath)) {
Write-Host " Downloading nssm..." -ForegroundColor Gray
$nssmUrl = "https://repo.pyp.ar/public-pull/easybot-windows-agent/raw/branch/main/bin/nssm.exe"
Invoke-WebRequest -Uri $nssmUrl -OutFile $nssmPath -UseBasicParsing
}
# Find the easybot-windows-agent script
$agentScript = & $pythonCmd.Split()[0] $pythonCmd.Split()[1..99] -c "import shutil; print(shutil.which('easybot-windows-agent') or '')" 2>$null
if (-not $agentScript) {
# Fallback: use python -m
$agentScript = ""
}
# Remove existing service if present (ignore errors if not installed)
$ErrorActionPreference = "Continue" $ErrorActionPreference = "Continue"
if (Test-Path $nssmPath) {
& $nssmPath stop $ServiceName 2>&1 | Out-Null & $nssmPath stop $ServiceName 2>&1 | Out-Null
& $nssmPath remove $ServiceName confirm 2>&1 | Out-Null & $nssmPath remove $ServiceName confirm 2>&1 | Out-Null
}
# Remove old scheduled task if present
schtasks /delete /tn $TaskName /f 2>&1 | Out-Null
$ErrorActionPreference = "Stop" $ErrorActionPreference = "Stop"
# Parse config.env for environment variables # Find Python executable
$envVars = @()
Get-Content $configFile | ForEach-Object {
if ($_ -match "^([^#=]+)=(.*)$") {
$envVars += "$($Matches[1])=$($Matches[2])"
}
}
if ($agentScript) {
& $nssmPath install $ServiceName $agentScript
} else {
$pythonExe = & $pythonCmd.Split()[0] $pythonCmd.Split()[1..99] -c "import sys; print(sys.executable)" $pythonExe = & $pythonCmd.Split()[0] $pythonCmd.Split()[1..99] -c "import sys; print(sys.executable)"
& $nssmPath install $ServiceName $pythonExe "-m" "easybot_windows_agent.main"
# Build a launcher script that loads config.env and runs the agent
$launcherScript = "$InstallDir\start-agent.ps1"
@"
# EasyBot Windows Agent Launcher
`$configFile = "$InstallDir\config.env"
if (Test-Path `$configFile) {
Get-Content `$configFile | ForEach-Object {
if (`$_ -match "^([^#=]+)=(.*)$") {
[System.Environment]::SetEnvironmentVariable(`$Matches[1], `$Matches[2], "Process")
} }
}
}
& "$pythonExe" -m easybot_windows_agent.main *>> "$InstallDir\agent.log"
"@ | Set-Content -Path $launcherScript -Encoding UTF8
& $nssmPath set $ServiceName DisplayName "EasyBot Windows Agent" # Create scheduled task: runs at logon, highest privileges, restarts on failure
& $nssmPath set $ServiceName Description "Remote Windows GUI automation agent for EasyBot" $action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File `"$launcherScript`""
& $nssmPath set $ServiceName AppDirectory $InstallDir $trigger = New-ScheduledTaskTrigger -AtLogOn
& $nssmPath set $ServiceName AppEnvironmentExtra ($envVars -join "`n") $settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -RestartInterval (New-TimeSpan -Seconds 30) -RestartCount 999 -StartWhenAvailable
& $nssmPath set $ServiceName AppStdout "$InstallDir\agent.log" $principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -RunLevel Highest -LogonType Interactive
& $nssmPath set $ServiceName AppStderr "$InstallDir\agent.log"
& $nssmPath set $ServiceName AppRotateFiles 1
& $nssmPath set $ServiceName AppRotateBytes 10485760
& $nssmPath set $ServiceName Start SERVICE_AUTO_START
& $nssmPath set $ServiceName Type SERVICE_INTERACTIVE_PROCESS
& $nssmPath set $ServiceName ObjectName "LocalSystem"
& $nssmPath set $ServiceName AppExit Default Restart
& $nssmPath set $ServiceName AppRestartDelay 5000
Write-Host " Service installed: $ServiceName" -ForegroundColor Green Register-ScheduledTask -TaskName $TaskName -Action $action -Trigger $trigger -Settings $settings -Principal $principal -Force | Out-Null
Write-Host " Scheduled task created: $TaskName" -ForegroundColor Green
# Start the service # Start it now
& $nssmPath start $ServiceName | Out-Null Start-ScheduledTask -TaskName $TaskName
Write-Host " Service started!" -ForegroundColor Green Write-Host " Agent started!" -ForegroundColor Green
Write-Host "" Write-Host ""
Write-Host "========================================" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan
@ -199,11 +187,11 @@ Write-Host ""
Write-Host " Install dir: $InstallDir" -ForegroundColor Gray Write-Host " Install dir: $InstallDir" -ForegroundColor Gray
Write-Host " Config file: $configFile" -ForegroundColor Gray Write-Host " Config file: $configFile" -ForegroundColor Gray
Write-Host " Log file: $InstallDir\agent.log" -ForegroundColor Gray Write-Host " Log file: $InstallDir\agent.log" -ForegroundColor Gray
Write-Host " Service: $ServiceName" -ForegroundColor Gray Write-Host " Task: $TaskName" -ForegroundColor Gray
Write-Host "" Write-Host ""
Write-Host " Commands:" -ForegroundColor White Write-Host " Commands:" -ForegroundColor White
Write-Host " nssm status $ServiceName # Check status" -ForegroundColor Gray Write-Host " schtasks /query /tn $TaskName # Check status" -ForegroundColor Gray
Write-Host " nssm restart $ServiceName # Restart agent" -ForegroundColor Gray Write-Host " Stop-ScheduledTask -TaskName $TaskName # Stop agent" -ForegroundColor Gray
Write-Host " nssm stop $ServiceName # Stop agent" -ForegroundColor Gray Write-Host " Start-ScheduledTask -TaskName $TaskName # Start agent" -ForegroundColor Gray
Write-Host " nssm remove $ServiceName # Uninstall" -ForegroundColor Gray Write-Host " schtasks /delete /tn $TaskName /f # Uninstall" -ForegroundColor Gray
Write-Host "" Write-Host ""