Python web dashboard for reserving and launching Windows Remote Desktop machines.
Project description
Windows Remote Desktop Dashboard
Python-based browser dashboard for reserving shared Windows RDP machines and pushing per-IP firewall locks so only the reserver can connect.
Install
pip install windows-remote-desktop-dashboard
windows-remote-desktop-dashboard
Open http://127.0.0.1:8000 (the app binds to 0.0.0.0 so other laptops on your LAN can hit it via the host machine's IP).
Development
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
Features
- Dark, screenshot-style dashboard with machine list, details pane, admin modal, and audit log.
- SQLite persistence under
%LOCALAPPDATA%\WindowsRemoteDesktopDashboard\databy default on Windows. - One active reservation per machine, auto-released on expiry.
- Direct local
mstsc.exelaunch with a downloadable.rdpfallback. - Generated
.rdpfiles default to clipboard, drives, USB, printers, smart cards, audio capture/playback, multi-monitor, dynamic resolution, keyboard hook, and font smoothing all enabled. - RDP Login button automatically reserves the machine for the dashboard user, then launches
C:\Windows\System32\mstsc.exe. - Windows firewall lockdown is ON by default: when a machine is reserved, the target PC's port 3389 is restricted to the reserver's IP and an explicit Block-Other-RDP rule is pushed so native
mstsc.exefrom anyone else is dropped at the network layer. - Verify lock button per machine that returns the actual rule state from the target host.
- Background
quser /server:<host>session checks that never block the page. - Admin PIN gate with single browser-session unlock and bulk delete/release/refresh controls.
- Admin modal split into Settings, Inventory, and Manage Machines tabs.
- Domain dropdown limited to
EUandAP; any legacyFUrows are migrated toEUon startup. - Aggressive cache busting for static assets (custom static handler that returns
Cache-Control: no-storeand a per-processBUILD_IDquery string).
Defaults That Match A Locked-Down Setup
| Setting | Default | Override env var |
|---|---|---|
| Admin PIN | admin |
ADMIN_PIN |
| Bind host | 0.0.0.0 |
RDD_HOST |
| Browser launch host | 127.0.0.1 |
RDD_BROWSER_HOST |
| Port | 8000 |
RDD_PORT |
| Data dir | %LOCALAPPDATA%\WindowsRemoteDesktopDashboard\data |
RDD_DATA_DIR |
| Default domain | EU |
RDP_DOMAIN |
| Firewall lock | ON | RDD_ENFORCE_WINDOWS_FIREWALL=0 to disable at startup |
| Background session refresh | ON | RDD_AUTO_REFRESH_SESSIONS=0 to disable |
| Session refresh interval | 30s | RDD_SESSION_REFRESH_SECONDS |
| Firewall PowerShell timeout | 20s | RDD_FIREWALL_TIMEOUT_SECONDS |
| Auto-open browser | yes | RDD_OPEN_BROWSER=0 to disable |
You can also toggle the firewall lock at runtime from Admin → Settings → RDP lock ON/OFF. The setting is persisted in SQLite.
How The Native-RDP Block Works
When RDP lock is ON the dashboard runs the following on the target machine over WinRM, every time a reservation is created:
- Tighten every inbound
Remote Desktoprule'sRemoteAddressfilter to the reserver's client IP. - Add
RDD-Block-Other-RDP(Block, TCP 3389, RemoteAddress=Any) so anything not matching the reserver IP is dropped. - Add
RDD-Block-Other-RDP-Allow(Allow, TCP 3389, RemoteAddress=) so the reserver still gets in.
When the reservation is revoked/released/deleted those two RDD-* rules are removed and the Remote Desktop rules are restored to RemoteAddress=Any.
Requirements for this to actually block native RDP:
- The dashboard server is Windows and runs as a user that can
Invoke-Commandon the target PCs (typically domain admin on the targets or WinRM withEnable-PSRemoting). - WinRM (
winrm quickconfig) is enabled on every target PC. - Users open the dashboard with the server's LAN hostname/IP, not
localhost, so the dashboard can read their real client IP and not127.0.0.1.
Use Admin → Manage Machines → Verify lock to check a specific target. If WinRM is misconfigured the dashboard will report the exact PowerShell error.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file windows_remote_desktop_dashboard-0.3.0.tar.gz.
File metadata
- Download URL: windows_remote_desktop_dashboard-0.3.0.tar.gz
- Upload date:
- Size: 21.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2bc8fdedc364972a93b53210758e6a1c78e6abe2be4aac7f706c7a09b42ad6c9
|
|
| MD5 |
9b5e576d73f7803703ad16af5242fbaf
|
|
| BLAKE2b-256 |
d8fc3713531b924eb6342f50e25facb74e6d3aafb2d95e6c83d74c9fc986f735
|
File details
Details for the file windows_remote_desktop_dashboard-0.3.0-py3-none-any.whl.
File metadata
- Download URL: windows_remote_desktop_dashboard-0.3.0-py3-none-any.whl
- Upload date:
- Size: 21.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd7d4b19031765da97ea493421176d7d93f440eb15ca56129b7fc00dac9e8d25
|
|
| MD5 |
d0e949dd86810ad2dcfbc21229eb8dcf
|
|
| BLAKE2b-256 |
8a469f24badbab12f917ea8420b14002dc4e492a542b93d6d0953f7ca6afbf44
|