Skip to content

feat(windows): ship templates with RDP enabled - #33

Open
gabbelitoV2 wants to merge 1 commit into
ConvoyPanel:mainfrom
gabbelitoV2:feat/windows-rdp-enabled
Open

feat(windows): ship templates with RDP enabled#33
gabbelitoV2 wants to merge 1 commit into
ConvoyPanel:mainfrom
gabbelitoV2:feat/windows-rdp-enabled

Conversation

@gabbelitoV2

Copy link
Copy Markdown
Contributor

Windows Server ships with RDP off and nothing in the build changed that, so a clone's only first contact was the noVNC console. That path breaks in practice: the console types against the guest's en-US layout, so a --cipassword containing symbols typed on a non-US client keyboard arrives as different characters. Observed live 2026-08-18 on a 2025 clone: '=' typed on a Swedish layout never matched, the Security log filled with 0xC000006A (wrong password), while the very same string passed an in-guest LogonUser type 2. Convoy provisions clones with only --cipassword, so RDP is the expected first door in.

Finalize.ps1 sets fDenyTSConnections=0 and enables the inbox Remote Desktop firewall group in the post-generalize block -- the same slot as the WU-policy restore, for the same reason: registry writes after /quit land in the sealed image, and the Remote Desktop rules are disjoint from the WinRM rules the teardown removes, so packer's session survives. The group is matched by its locale-independent id (@FirewallAPI.dll,-28752), not the DisplayGroup string. NLA stays at its Server default (required), so nothing is reachable pre-auth.

The tradeoff is deliberate and documented: every clone exposes 3389 on whatever network it lands on, including public ones, guarded by NLA plus the strength of --cipassword. The new rdp-enabled verify check asserts enabled + listening on 3389 + NLA on for every clone, so a regression in either direction fails verify by name.

Verified live on a 2025 clone (runtime enablement: listener up instantly, external connect to 3389 OK); untested on a full build as of 2026-08-19 -- recorded as such in docs/windows.md.

Windows Server ships with RDP off and nothing in the build changed that,
so a clone's only first contact was the noVNC console. That path breaks
in practice: the console types against the guest's en-US layout, so a
--cipassword containing symbols typed on a non-US client keyboard
arrives as different characters. Observed live 2026-08-18 on a 2025
clone: '=' typed on a Swedish layout never matched, the Security log
filled with 0xC000006A (wrong password), while the very same string
passed an in-guest LogonUser type 2. Convoy provisions clones with only
--cipassword, so RDP is the expected first door in.

Finalize.ps1 sets fDenyTSConnections=0 and enables the inbox Remote
Desktop firewall group in the post-generalize block -- the same slot as
the WU-policy restore, for the same reason: registry writes after /quit
land in the sealed image, and the Remote Desktop rules are disjoint from
the WinRM rules the teardown removes, so packer's session survives. The
group is matched by its locale-independent id (@FirewallAPI.dll,-28752),
not the DisplayGroup string. NLA stays at its Server default (required),
so nothing is reachable pre-auth.

The tradeoff is deliberate and documented: every clone exposes 3389 on
whatever network it lands on, including public ones, guarded by NLA plus
the strength of --cipassword. The new rdp-enabled verify check asserts
enabled + listening on 3389 + NLA on for every clone, so a regression in
either direction fails verify by name.

Verified live on a 2025 clone (runtime enablement: listener up
instantly, external connect to 3389 OK); untested on a full build as of
2026-08-19 -- recorded as such in docs/windows.md.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant