How I Tested Free Windows RDP Using GitHub & Tablescales — Video Summary
This post summarizes my YouTube video where I walk through the concept and high-level workflow I used to provision a temporary Windows RDP for testing using GitHub and Tablescales. Below you'll find the key takeaways, safety and legal notes, and a centered, paste-ready area where you can insert the example code from the video.
What the video covers (TL;DR)
In the video I explain a testing approach that leverages publicly available platforms (GitHub) alongside a data/automation layer (Tablescales) to provision a short-lived Windows RDP instance for development and testing purposes. The demo is presented as a concept: how the pieces fit together, the prerequisites to understand, and the expected outcomes when you use similar, legitimate resources.
High-level workflow (conceptual)
- Identify resources: I describe the types of repositories and automation hooks that can be used to orchestrate temporary test environments.
- Use a data/automation layer: Tablescales (as demonstrated) acts as the intermediary that holds configuration/state and triggers provisioning actions.
- Provisioning lifecycle: The demo emphasizes creating an environment for a short duration, validating it, and tearing it down afterwards.
- Cleanup and limits: Important attention is paid to automatic cleanup so the environment doesn't persist longer than needed.
Note: This summary intentionally stays conceptual and does not reproduce the command-by-command walkthrough from the video. For the step-by-step demo, please refer to the original YouTube video linked in the video description.
Why this approach can be useful
Using ephemeral environments for testing reduces cost, improves repeatability, and helps isolate development experiments. It is especially helpful for:
- Quickly validating software on a real Windows desktop target
- Testing deployment scripts or automation flows
- Reproducing issues in a disposable environment without affecting production
RDP Setup By Ahmed Tech
Copy the code below to create a free RDP
name: RDP
on:
workflow_dispatch:
jobs:
secure-rdp:
runs-on: windows-latest
timeout-minutes: 3600
steps:
- name: Configure Core RDP Settings
run: |
# Enable Remote Desktop and disable Network Level Authentication (if needed)
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' `
-Name "fDenyTSConnections" -Value 0 -Force
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' `
-Name "UserAuthentication" -Value 0 -Force
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' `
-Name "SecurityLayer" -Value 0 -Force
# Remove any existing rule with the same name to avoid duplication
netsh advfirewall firewall delete rule name="RDP-Tailscale"
# For testing, allow any incoming connection on port 3389
netsh advfirewall firewall add rule name="RDP-Tailscale" `
dir=in action=allow protocol=TCP localport=3389
# (Optional) Restart the Remote Desktop service to ensure changes take effect
Restart-Service -Name TermService -Force
- name: Create RDP User with Secure Password
run: |
Add-Type -AssemblyName System.Security
$charSet = @{
Upper = [char[]](65..90) # A-Z
Lower = [char[]](97..122) # a-z
Number = [char[]](48..57) # 0-9
Special = ([char[]](33..47) + [char[]](58..64) +
[char[]](91..96) + [char[]](123..126)) # Special characters
}
$rawPassword = @()
$rawPassword += $charSet.Upper | Get-Random -Count 4
$rawPassword += $charSet.Lower | Get-Random -Count 4
$rawPassword += $charSet.Number | Get-Random -Count 4
$rawPassword += $charSet.Special | Get-Random -Count 4
$password = -join ($rawPassword | Sort-Object { Get-Random })
$securePass = ConvertTo-SecureString $password -AsPlainText -Force
New-LocalUser -Name "RDP" -Password $securePass -AccountNeverExpires
Add-LocalGroupMember -Group "Administrators" -Member "RDP"
Add-LocalGroupMember -Group "Remote Desktop Users" -Member "RDP"
echo "RDP_CREDS=User: RDP | Password: $password" >> $env:GITHUB_ENV
if (-not (Get-LocalUser -Name "RDP")) {
Write-Error "User creation failed"
exit 1
}
- name: Install Tailscale
run: |
$tsUrl = "https://pkgs.tailscale.com/stable/tailscale-setup-1.82.0-amd64.msi"
$installerPath = "$env:TEMP\tailscale.msi"
Invoke-WebRequest -Uri $tsUrl -OutFile $installerPath
Start-Process msiexec.exe -ArgumentList "/i", "`"$installerPath`"", "/quiet", "/norestart" -Wait
Remove-Item $installerPath -Force
- name: Establish Tailscale Connection
run: |
# Bring up Tailscale with the provided auth key and set a unique hostname
& "$env:ProgramFiles\Tailscale\tailscale.exe" up --authkey=${{ secrets.TAILSCALE_AUTH_KEY }} --hostname=gh-runner-$env:GITHUB_RUN_ID
# Wait for Tailscale to assign an IP
$tsIP = $null
$retries = 0
while (-not $tsIP -and $retries -lt 10) {
$tsIP = & "$env:ProgramFiles\Tailscale\tailscale.exe" ip -4
Start-Sleep -Seconds 5
$retries++
}
if (-not $tsIP) {
Write-Error "Tailscale IP not assigned. Exiting."
exit 1
}
echo "TAILSCALE_IP=$tsIP" >> $env:GITHUB_ENV
- name: Verify RDP Accessibility
run: |
Write-Host "Tailscale IP: $env:TAILSCALE_IP"
# Test connectivity using Test-NetConnection against the Tailscale IP on port 3389
$testResult = Test-NetConnection -ComputerName $env:TAILSCALE_IP -Port 3389
if (-not $testResult.TcpTestSucceeded) {
Write-Error "TCP connection to RDP port 3389 failed"
exit 1
}
Write-Host "TCP connectivity successful!"
- name: Maintain Connection
run: |
Write-Host "`n=== RDP ACCESS ==="
Write-Host "Address: $env:TAILSCALE_IP"
Write-Host "Username: RDP"
Write-Host "Password: $(echo $env:RDP_CREDS)"
Write-Host "==================`n"
# Keep runner active indefinitely (or until manually cancelled)
while ($true) {
Write-Host "[$(Get-Date)] RDP Active - Use Ctrl+C in workflow to terminate"
Start-Sleep -Seconds 300
}
Safety, legality & best practices
Best practices I highlight in the video and recommend here:
- Use official free tiers, trial accounts, or developer sandboxes when available.
- Limit the lifetime of any test instance and automate cleanup.
- Track costs and usage if you use cloud resources that may incur charges.
- Never use test methods to access systems you don't own or aren't explicitly authorized to use.
Alternatives & legit options for Windows testing
If you want safe, supported ways to test Windows environments, consider official offerings such as cloud provider free tiers, Microsoft developer images (official evaluation VMs), or managed test labs that explicitly allow short-term test instances. Those routes provide clear terms-of-service and support channels.
Call to action
Watch the full walkthrough on my YouTube channel for the live demo and timestamps. If you found the video useful, please like, subscribe, and comment — I read replies and answer questions about the concepts. If you want this article updated with a transcript or step-by-step checklist (redacted to stay within safe/legal bounds), leave a comment below.
FAQ
- Q: Will this article give me a step-by-step way to bypass paid services?
- A: No. This summary explains the concept and safety notes. For responsible, authorized provisioning use documented free tiers and official trials.
- Q: Can I re-use the code you showed in the video?
- A: You can paste your own example into the code area above for readers to copy. Make sure any code you publish does not violate terms of service of any platform.
