Files
Privatae e4c9b69b46
ci / personal-data (push) Successful in 5s
ci / test (push) Successful in 3m4s
ci / fuzz (push) Successful in 3m45s
bastion 0.53.2
2026-10-20 04:42:14 +00:00

51 lines
1.7 KiB
Go

//go:build windows
package main
import (
"encoding/base64"
"unicode/utf16"
)
// Windows scheduler inventory: Get-ScheduledTask through PowerShell, the
// same fixed -EncodedCommand shape computer_tree_windows.go uses. Not
// `schtasks /query /fo csv`: its column headers are localised, and parsing
// them would silently find nothing on a non-English Windows. The script
// emits one compact JSON object per task with the fields parseWinTasksJSON
// reads; disabled tasks are skipped (they cannot fire).
const windowsTasksScript = `
$ErrorActionPreference = 'SilentlyContinue'
Get-ScheduledTask | Where-Object { $_.State -ne 'Disabled' } | ForEach-Object {
[pscustomobject]@{
n = $_.TaskName
p = $_.TaskPath
u = $_.Principal.UserId
s = [string]$_.State
a = @($_.Actions | ForEach-Object { ('"' + ([string]$_.Execute) + '" ' + ([string]$_.Arguments)).Trim() })
t = @($_.Triggers | ForEach-Object { $_.CimClass.CimClassName })
}
} | ConvertTo-Json -Compress -Depth 4
`
// encodePowerShell renders a script as -EncodedCommand wants it: UTF-16LE, base64.
func encodePowerShell(script string) string {
u := utf16.Encode([]rune(script))
b := make([]byte, 0, len(u)*2)
for _, c := range u {
b = append(b, byte(c), byte(c>>8))
}
return base64.StdEncoding.EncodeToString(b)
}
var windowsTasksEncoded = encodePowerShell(windowsTasksScript)
func platformSchedulers() ([]schedEntry, []string, bool) {
out, err := runTimed("powershell.exe", "-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass",
"-EncodedCommand", windowsTasksEncoded)
if err != nil {
return nil, []string{}, true // PowerShell present but the query failed: supported, nothing read
}
return parseWinTasksJSON(out), []string{"task-scheduler"}, true
}