Summary
Automates the full display stack on Windows-based SOC machines: scheduled power, unattended login, browser launch, and SSO authentication. Each layer is independent; you can deploy as much or as little as needed. I've also laid the groundwork for a local AI assistant layer, covered in Part 6.
Part 1: Scheduled Power
Wake: BIOS Scheduled Power-On
PowerShell cannot turn on a fully powered-off machine. Use one of:
- BIOS/UEFI RTC Wake (Recommended) — Set a daily wake time in firmware under Power Management. Labels vary: "Auto Power On", "Scheduled Boot", "RTC Alarm".
- Wake-on-LAN (WoL) — Requires machines left in sleep/hibernate. A server sends a magic packet to wake them. Requires WoL enabled in BIOS and on the network adapter.
Enabling WoL via PowerShell
Get-NetAdapter | Where-Object { $_.Status -eq 'Up' } | ForEach-Object {
$adapterName = $_.Name
$adapter = Get-WmiObject MSPower_DeviceWakeEnable -Namespace root\wmi |
Where-Object { $_.InstanceName -match $adapterName }
if ($adapter) { $adapter.Enable = $true; $adapter.Put() }
}
To send the magic packet from a management server:
# Send-WOL -MacAddress '00:1A:2B:3C:4D:5E'
# Or use wolcmd.exe
Shutdown: Task Scheduler
GUI: Task Scheduler → Create Basic Task → Weekly, Mon–Fri at 17:00, action shutdown.exe /s /t 60.
PowerShell (preferred for multiple machines):
$action = New-ScheduledTaskAction -Execute "shutdown.exe" -Argument "/s /t 60"
$trigger = New-ScheduledTaskTrigger -Weekly `
-DaysOfWeek Monday,Tuesday,Wednesday,Thursday,Friday `
-At "17:00"
$settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 2)
Register-ScheduledTask `
-TaskName "SOC-Display-Shutdown" `
-Action $action `
-Trigger $trigger `
-Settings $settings `
-RunLevel Highest `
-Force
Manual Override
- Immediate shutdown:
shutdown /s /t 0 - Cancel pending shutdown:
shutdown /a - Disable tonight's shutdown:
Disable-ScheduledTask -TaskName 'SOC-Display-Shutdown' - Re-enable:
Enable-ScheduledTask -TaskName 'SOC-Display-Shutdown'
Create on-demand tasks SOC-Display-Shutdown-Disable and SOC-Display-Shutdown-Enable for
quick toggling without opening Task Scheduler. These can be wired to voice commands in Part 6.
Part 2: Windows Auto-Login
Sysinternals Autologon
Do not use the raw registry approach (DefaultPassword in plaintext). Use
Autologon.exe from
Microsoft Sysinternals; it stores credentials encrypted via LSA secrets.
# GUI: run autologon.exe and fill in the form
# Scripted:
autologon.exe <username> <domain> <password> /accepteula
For local accounts, use the machine name or . as the domain.
Azure AD / Entra ID Joined Machines
Domain-joined machines with Autologon + Edge will silently authenticate to SSO providers via Windows Integrated Authentication (PRT tokens on Entra ID). Dashboards may open already logged in with no further steps.
- Entra ID joined — Edge uses the PRT for silent auth. No credentials stored in browser.
- On-prem AD / federated SSO — Kerberos tokens pass through with proper GPO settings.
- Workgroup machines — Require browser session management (Part 3).
Security Considerations
Use a dedicated service account with read-only dashboard access, not a personal or admin account.
- Enable screen lock on idle if displays are accessible to non-staff.
- LSA encryption is not unbreakable. Minimize what this account can access.
- Log autologin activity to detect unexpected interactive sessions.
Part 3: Browser Launch and SSO
Launch on Login
$action = New-ScheduledTaskAction `
-Execute "msedge.exe" `
-Argument "--start-fullscreen https://your-dashboard-url.com"
$trigger = New-ScheduledTaskTrigger -AtLogOn
Register-ScheduledTask `
-TaskName "SOC-Display-Launch" `
-Action $action `
-Trigger $trigger `
-RunLevel Highest `
-Force
For multiple monitors, use --window-position to place each window:
# Monitor 1 — position 0,0
$arg1 = "--start-fullscreen --window-position=0,0 https://dashboard-one.com"
# Monitor 2 — position 1920,0
$arg2 = "--start-fullscreen --window-position=1920,0 https://dashboard-two.com"
Edge vs. Chrome
Prefer Edge in enterprise environments:
- Uses the Windows PRT on Entra ID-joined machines for silent SSO.
--kioskflag gives a locked-down, chrome-free fullscreen mode.- Manageable via Group Policy or Intune.
Session Persistence
- Settings → On Startup → Continue where you left off
- Use a dedicated browser profile for the display account
- Disable Clear cookies on exit
Testing SSO Behavior
Before relying on silent auth, test each dashboard URL on a clean session and note which require a button click. Dashboards that authenticate silently need no further work; the rest go through Playwright in Part 4.
Once one SSO session is established, subsequent dashboards on the same identity provider typically authenticate transparently. Usually only the first dashboard requires any interaction.
Part 4: Playwright for SSO Prompts
In this architecture, Playwright handles identity provider login buttons.
Setup
pip install playwright
playwright install chromium
Reusing the Existing Browser Profile
Point Playwright at the display machine's existing Edge profile so it inherits the authenticated session:
from playwright.sync_api import sync_playwright
import os
PROFILE_PATH = os.path.expandvars(r'%LOCALAPPDATA%\Microsoft\Edge\User Data')
with sync_playwright() as p:
browser = p.chromium.launch_persistent_context(
user_data_dir=PROFILE_PATH,
channel='msedge',
headless=False,
args=['--start-fullscreen']
)
page = browser.new_page()
page.goto('https://your-dashboard-url.com')
Clicking the SSO Button
# By text
page.wait_for_selector('text=Sign in with SSO', timeout=10000)
page.click('text=Sign in with SSO')
page.wait_for_load_state('networkidle')
# By CSS selector
page.wait_for_selector('#sso-login-btn')
page.click('#sso-login-btn')
# By ARIA role
page.get_by_role('button', name='Sign in with SSO').click()
Multi-Dashboard Launch Script
from playwright.sync_api import sync_playwright
import os, time
PROFILE = os.path.expandvars(r'%LOCALAPPDATA%\Microsoft\Edge\User Data')
DASHBOARDS = [
'https://tickets.example.com',
'https://security.example.com',
'https://network.example.com',
]
def handle_sso_if_present(page):
try:
btn = page.wait_for_selector('text=Sign in with SSO', timeout=5000)
if btn:
btn.click()
page.wait_for_load_state('networkidle')
except:
pass # Already authenticated
with sync_playwright() as p:
ctx = p.chromium.launch_persistent_context(
user_data_dir=PROFILE,
channel='msedge',
headless=False,
args=['--start-fullscreen']
)
time.sleep(3)
for url in DASHBOARDS:
page = ctx.new_page()
page.goto(url)
handle_sso_if_present(page)
# Do not call ctx.close()
Task Scheduler Registration
$action = New-ScheduledTaskAction `
-Execute "python.exe" `
-Argument "C:\SOC\launch_dashboards.py"
$trigger = New-ScheduledTaskTrigger -AtLogOn
Register-ScheduledTask -TaskName "SOC-Display-Playwright" `
-Action $action -Trigger $trigger -RunLevel Highest -Force
Part 5: AI Voice Assistant
A locally-hosted assistant that accepts spoken commands and queries security tooling. Covered in full in Part 6.
Stack: faster-whisper (STT) → Ollama LLM (Llama 3.1 / Phi-4) → tool execution → Kokoro (TTS)
Planned tools:
- Display Control — enable/disable scheduled power tasks via PowerShell
- Jira Search — query tickets by keyword and commenter via REST API
- Browser Read — read dashboard metrics via Playwright
- Web Fetch — fetch CVE details, advisories, internal wiki pages
All processing is local. No queries about active threats, asset counts, or ticket contents transit external APIs.