lamco-rdp-tools
CLI Automation Toolkit for RDP
A single Rust binary (rdpdo) with 55 commands for automating, testing, and provisioning
Windows and Linux desktops over RDP. No guest-side installation required.
What is rdpdo?
There has never been an automation tool for RDP the way vncdotool exists for VNC.
rdpdo fills that gap. It connects to any RDP server, sends input, captures screenshots, matches visual elements,
transfers clipboard data, records sessions, and outputs results in JSON or JUnit XML for CI/CD pipelines.
Built on IronRDP -- the same pure-Rust protocol stack that powers lamco-rdp-server -- rdpdo requires zero guest-side installation. No agents, no scripts on the remote machine, no elevated privileges on the target. Everything happens over the standard RDP protocol.
55 Commands Across 9 Categories
Input
Send keystrokes, mouse clicks, drags, and text to the remote desktop.
Capture
Take screenshots, capture regions, or record timelapses of the remote screen.
Visual Match
Wait for or assert visual elements using normalized cross-correlation image matching.
Clipboard
Set and get clipboard contents, transfer files via the RDP clipboard channel.
Audio
Capture remote audio streams and assert audio is playing for media testing.
Provisioning
Automate portal acceptance, screen unlock, and login flows for unattended setup.
Calibration
Grid-based click offset calibration for pixel-perfect input accuracy across displays.
Recording
Record full sessions with input events and replay them for regression testing.
CI/CD Integration
Machine-readable output for continuous integration with JSON and JUnit XML support.
Why rdpdo Matters
The Problem
- × VNC has vncdotool -- RDP has had nothing comparable
- × Existing approaches require agents installed on the guest
- × FreeRDP + xdotool chains are fragile and slow
- × No visual assertion tooling for RDP desktop testing
The Solution
- ✓ Single binary, zero dependencies on the remote machine
- ✓ Native RDP protocol -- works with any RDP server
- ✓ Image matching via normalized cross-correlation (no OpenCV)
- ✓ CI/CD-ready with JSON and JUnit XML output
How rdpdo Compares
| Feature | rdpdo | vncdotool | aardwolf | FreeRDP + xdotool | scrying | openQA |
|---|---|---|---|---|---|---|
| Protocol | RDP | VNC | RDP | RDP + X11 | RDP/VNC | VNC/Serial |
| Guest agent required | No | No | No | Yes (xdotool) | No | Yes |
| Input automation | Full | Full | No | Partial | No | Full |
| Visual matching | Built-in (NCC) | No | No | No | No | OpenCV |
| Clipboard automation | Yes | No | No | Partial | No | No |
| CI/CD output | JSON + JUnit | No | No | No | No | Yes |
| Language | Rust | Python | Rust | C + Shell | Rust | Perl |
| Single binary | Yes | No (Python) | Yes | No | Yes | No |
Technical Details
Key Design Decisions
- • Built on IronRDP -- the same pure-Rust RDP protocol stack used by lamco-rdp-server, ensuring protocol compatibility and shared improvements.
- • No OpenCV dependency -- image matching uses normalized cross-correlation implemented in pure Rust, keeping the binary self-contained.
- • No display server required -- rdpdo does not need X11, Wayland, or any GUI. It runs headless in CI/CD environments.
- • No Python dependency -- unlike vncdotool, rdpdo compiles to a single static binary with no runtime dependencies.
Example Usage
# Connect and type into the remote desktop
rdpdo --host 10.0.0.5 --user admin type "Hello, World!"
# Take a screenshot
rdpdo --host 10.0.0.5 --user admin screenshot desktop.png
# Wait for a visual element to appear (10s timeout)
rdpdo --host 10.0.0.5 --user admin waitfor login-button.png --timeout 10
# Click on a matched visual element
rdpdo --host 10.0.0.5 --user admin click --image ok-button.png
# Transfer clipboard text
rdpdo --host 10.0.0.5 --user admin clip-set "deployment config data"
# CI/CD: run a test sequence with JUnit output
rdpdo --host 10.0.0.5 --user admin --junit results.xml \
screenshot before.png \
type "notepad" key enter \
waitfor notepad-window.png --timeout 15 \
screenshot after.png
Current Status
Pre-release v0.1.0 -- All 55 commands are implemented. The tool is functional and being used internally for testing lamco-rdp-server. Public release is planned after further stabilization.
rdpdo is MIT-licensed and will be free and open source upon release.