Shared Windows Debug Machine¶
Home / Infrastructure / Shared Windows Debug Machine
Setup Guide
Setup and configuration guide for a shared Windows machine used for ModuleWorks debugging and headless CI.
A shared Windows machine running ModuleWorks debugging tools, accessible to the team via Remote Desktop. The machine stays always-on and doubles as a headless CI runner for automated tests.
Architecture¶
graph LR
subgraph Team Devices
A[Windows Laptop]
B[macOS Laptop]
C[Linux Workstation]
end
subgraph Tailscale VPN
T[Encrypted WireGuard Mesh]
end
subgraph Windows Debug Machine
RDP[RDP Host - Win 11 Pro]
MW[ModuleWorks Tools]
CI[CI Agent - Windows Service]
end
A -->|mstsc.exe| T
B -->|Windows App| T
C -->|Remmina / xfreerdp| T
T --> RDP
RDP --- MW
CI --- MW
Key constraints:
- One interactive RDP session at a time (Windows Pro limitation)
- Team members coordinate access via a shared Slack channel or calendar
- Automated tests run as a headless Windows service — no conflict with RDP sessions
Licensing¶
| Item | Cost | Notes |
|---|---|---|
| Windows 11 Pro upgrade | ~$199 one-time (retail) | Upgrade in-place from Home — no reset, existing accounts preserved |
| Windows Enterprise E3 | ~$7/user/month | Required for users connecting from macOS or Linux (provides VDA rights) |
| Tailscale | Free | Free tier covers up to 100 devices |
Why Enterprise E3? The Windows Pro license requires connecting devices to run Windows Pro or higher. macOS and Linux devices don't qualify, so each non-Windows user needs a Windows Enterprise E3 subscription (~$7/user/month) for compliant VDA (Virtual Desktop Access) rights.
The Pro upgrade itself is additive — no need to wipe the machine or remove existing user accounts. Go to Settings > System > Activation > Upgrade your edition of Windows, enter the Pro key, and existing accounts, files, and software are preserved.
Setup Guide¶
Phase 1: Windows Pro Upgrade¶
- Open Settings > System > Activation
- Select Upgrade your edition of Windows
- Enter the Windows 11 Pro product key
- The machine reboots and upgrades in-place — all user accounts, files, and installed software are preserved
Phase 2: Create User Accounts¶
Create individual local accounts instead of a shared Microsoft account. This gives each person their own profile, credentials, and audit trail.
For each account, add it to the Remote Desktop Users group:
Why not a shared Microsoft account?
A shared account means no audit trail (all actions look like one user), shared desktop/settings/browser profiles, and a password that must be redistributed whenever someone leaves. Individual local accounts avoid all of these problems.
Phase 3: Enable Remote Desktop¶
- Open Settings > System > Remote Desktop
- Toggle Enable Remote Desktop to On
- Confirm the prompt
- Verify Network Level Authentication (NLA) is enabled (it should be by default) — this requires authentication before a full session is established
Phase 4: Install and Configure Tailscale¶
Never expose RDP (port 3389) directly to the internet
RDP is one of the most commonly attacked protocols. Always access it through a VPN.
- Download and install Tailscale from tailscale.com/download
- Sign in with the team's Tailscale account
- Note the machine's Tailscale IP (shown in the Tailscale tray icon, format
100.x.x.x) - Install Tailscale on each team member's device and sign in to the same Tailnet
- Team members connect to the Tailscale IP — no port forwarding or firewall rules needed
Verify a direct connection (not relayed) with:
Direct connections have near-zero added latency. Relayed connections (via DERP servers) add noticeable lag above ~100-150ms round-trip.
Phase 5: Always-On Configuration¶
Power settings¶
- Open Settings > System > Power & Sleep (or Power & Battery)
- Set Screen and Sleep to Never when plugged in
-
Disable hibernation (run as Administrator):
Windows Update management¶
Prevent surprise reboots during work hours:
- Open Settings > Windows Update > Advanced Options
- Set Active Hours to the widest range possible (up to 18 hours)
- Enable Defer quality updates by 7 days
For tighter control via Group Policy (gpedit.msc):
Computer Configuration > Administrative Templates > Windows Components > Windows Update > Manage end user experience- Enable Turn off auto-restart for updates during active hours
- Set
NoAutoRebootWithLoggedOnUsersto1underHKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU
Pick a weekly maintenance window (e.g., Sunday 3 AM) for manual update checks and reboots.
Session timeout policies¶
Prevent stale sessions from blocking other users. Open gpedit.msc and navigate to:
Computer Configuration > Administrative Templates > Windows Components > Remote Desktop Services > Remote Desktop Session Host > Session Time Limits
| Policy | Recommended Value |
|---|---|
| Set time limit for disconnected sessions | 2 hours |
| Set time limit for active but idle sessions | 4 hours |
| End session when time limits are reached | Enabled |
Security hardening¶
- Account lockout: Open
secpol.msc> Account Policies > Account Lockout Policy. Set lockout threshold to 5 attempts, lockout duration to 30 minutes. - Audit logon events: Open
secpol.msc> Advanced Audit Policy Configuration > Logon/Logoff. Enable success and failure auditing. - Firewall: With Tailscale, RDP traffic flows over the encrypted WireGuard tunnel. Optionally restrict the Windows Firewall RDP rule to only accept connections from the Tailscale subnet (
100.64.0.0/10).
Phase 6: Install ModuleWorks Tools¶
Install the ModuleWorks debugging tools under a shared location (e.g., C:\Tools\ModuleWorks) accessible to all user accounts. Ensure each local account has read and execute permissions on the install directory.
Phase 7: CI Agent for Automated Testing¶
Since automated tests are headless, run the CI agent as a Windows service — this avoids any conflict with interactive RDP sessions.
-
Create a dedicated local account for the agent:
-
Install your CI agent (GitHub Actions runner, Azure DevOps agent, Jenkins agent, etc.) under the
ci-agentaccount - During installation, choose Run as a service when prompted
- The service runs in the background regardless of who is (or isn't) logged in via RDP
No conflicts with RDP
A service-mode CI agent has no desktop session. Team members can RDP in and out freely while tests run in the background. Tests can also run with nobody connected at all.
Connecting from Each OS¶
The best RDP experience. Built-in client, near-perfect visual quality.
- Press
Win+R, typemstsc, press Enter - Enter the machine's Tailscale IP (
100.x.x.x) - Click Connect, enter your credentials
Clipboard copy/paste (including files), drive redirection, audio, and multi-monitor all work out of the box.
Save a .rdp file
Click Show Options in mstsc, configure your settings, then Save As to create a one-click connection file.
Good experience with minor keyboard differences.
- Install Windows App from the Mac App Store (free)
- Go to the Devices tab, click +
- Enter the Tailscale IP and save
- Double-click to connect, enter your credentials
Clipboard and folder redirection work. Retina displays are supported. Keyboard note: Cmd maps to the Windows key — use Ctrl for Windows shortcuts (Ctrl+C, Ctrl+V, etc.).
Functional but visually rougher than Windows/macOS.
Remmina (GUI — easiest):
- Install:
sudo apt install remmina remmina-plugin-rdp(Ubuntu/Debian) orsudo dnf install remmina remmina-plugin-rdp(Fedora) - Open Remmina, click +, enter the Tailscale IP and credentials
- Connect
xfreerdp (CLI — more control):
Known issues: clipboard can be flaky on Wayland (X11 is more reliable), HiDPI scaling is a pain point, and visual quality is noticeably lower than Windows-to-Windows due to lack of Microsoft's optimized video codecs.
Access Coordination¶
With only one RDP session at a time, the team needs a way to coordinate:
- Slack channel (e.g.,
#debug-machine) — post when you're connecting and when you're done - Disconnected session timeouts (configured in Phase 5) ensure stale sessions don't block others
- If someone is connected when you try to join, they'll get a prompt asking if they want to allow you to take over their session