Rust implementation of the Microsoft Remote Desktop Protocol (RDP)
Find a file
Alex Yusiuk 4dc5945019
Some checks failed
CI / Check formatting (push) Has been cancelled
CI / Check typos (push) Has been cancelled
Coverage / Coverage Report (push) Has been cancelled
Release crates / Open release PR (push) Has been cancelled
Release crates / Release crates (push) Has been cancelled
CI / Success (push) Has been cancelled
CI / Checks [linux] (push) Has been cancelled
CI / Checks [macos] (push) Has been cancelled
CI / Checks [windows] (push) Has been cancelled
CI / Fuzzing (push) Has been cancelled
CI / Web Client (push) Has been cancelled
CI / FFI (push) Has been cancelled
fix(web): run navigator.clipboard.write only when window has focus (#858)
When we receive clipboard update from the server and the browser window
is not in focus (for example, when the user copies some text directly on
the machine, not via the browser's VNC viewer), we got an error that
`navigator.clipboard.write` is not allowed when window is not in focus.
This PR adds a window check that the window has focus, and now
`clipboard.write` runs only when the window is in focus.
2025-07-04 11:21:52 +00:00
.cargo refactor: re-organize workspace (#101) 2023-03-29 19:09:15 -04:00
.github ci(npm-publish): fix jobs dependencies (#811) 2025-06-11 10:01:58 -04:00
benches chore: update Rust toolchain to 1.88.0 (#852) 2025-07-03 07:38:28 +03:00
crates refactor(client): remove redundant value_parser option (#853) 2025-07-03 10:09:45 +00:00
ffi chore: update Rust toolchain to 1.88.0 (#852) 2025-07-03 07:38:28 +03:00
fuzz chore(release): prepare for publishing (#836) 2025-06-27 07:10:42 -04:00
web-client fix(web): run navigator.clipboard.write only when window has focus (#858) 2025-07-04 11:21:52 +00:00
xtask chore: update Rust toolchain to 1.88.0 (#852) 2025-07-03 07:38:28 +03:00
.gitattribute feat(ffi): initial C# bindings (connector only) (#423) 2024-04-05 15:11:32 +00:00
.gitignore docs(now-proto): add missing NOW-PROTO docs (#575) 2024-11-07 19:29:08 -05:00
ARCHITECTURE.md docs: update fuzz location in ARCHITECTURE.md (#797) 2025-05-31 02:27:52 +00:00
Cargo.lock chore(release): prepare for publishing (#851) 2025-07-03 05:53:00 +00:00
Cargo.toml feat(benches): add perfenc 2025-04-29 13:00:07 +02:00
cliff.toml chore(release): prepare for publishing (#656) 2025-01-31 04:22:55 +00:00
clippy.toml chore: update Rust toolchain to 1.88.0 (#852) 2025-07-03 07:38:28 +03:00
LICENSE-APACHE ironrdp: initial commit 2019-07-10 17:31:26 -04:00
LICENSE-MIT ironrdp: initial commit 2019-07-10 17:31:26 -04:00
README.md docs: add ironrdp docs.rs & crates.io badges 2024-10-29 19:14:20 +09:00
release-plz.toml chore: only publish GitHub releases for ironrdp-client (#704) 2025-03-14 11:00:44 +02:00
rust-toolchain.toml chore: update Rust toolchain to 1.88.0 (#852) 2025-07-03 07:38:28 +03:00
rustfmt.toml style: run cargo fmt 2022-04-15 13:39:34 -04:00
STYLE.md style(cliprdr): clarify invariants 2023-11-20 09:39:36 -05:00
typos.toml chore(release): prepare for publishing (#748) 2025-05-27 15:21:56 +00:00

IronRDP

A collection of Rust crates providing an implementation of the Microsoft Remote Desktop Protocol, with a focus on security.

Demonstration

https://user-images.githubusercontent.com/3809077/202049929-76f42471-aeb0-41da-9118-0dc6ea491bd2.mp4

Video Codec Support

Supported codecs:

  • Uncompressed raw bitmap
  • Interleaved Run-Length Encoding (RLE) Bitmap Codec
  • RDP 6.0 Bitmap Compression
  • Microsoft RemoteFX (RFX)

Examples

ironrdp-client

A full-fledged RDP client based on IronRDP crates suite, and implemented using non-blocking, asynchronous I/O.

cargo run --bin ironrdp-client -- <HOSTNAME> --username <USERNAME> --password <PASSWORD>

screenshot

Example of utilizing IronRDP in a blocking, synchronous fashion.

This example showcases the use of IronRDP in a blocking manner. It demonstrates how to create a basic RDP client with just a few hundred lines of code by leveraging the IronRDP crates suite.

In this basic client implementation, the client establishes a connection with the destination server, decodes incoming graphics updates, and saves the resulting output as a BMP image file on the disk.

cargo run --example=screenshot -- --host <HOSTNAME> --username <USERNAME> --password <PASSWORD> --output out.bmp

How to enable RemoteFX on server

Run the following PowerShell commands, and reboot.

Set-ItemProperty -Path 'HKLM:\Software\Policies\Microsoft\Windows NT\Terminal Services' -Name 'ColorDepth' -Type DWORD -Value 5
Set-ItemProperty -Path 'HKLM:\Software\Policies\Microsoft\Windows NT\Terminal Services' -Name 'fEnableVirtualizedGraphics' -Type DWORD -Value 1

Alternatively, you may change a few group policies using gpedit.msc:

  1. Run gpedit.msc.

  2. Enable Computer Configuration/Administrative Templates/Windows Components/Remote Desktop Services/Remote Desktop Session Host/Remote Session Environment/RemoteFX for Windows Server 2008 R2/Configure RemoteFX

  3. Enable Computer Configuration/Administrative Templates/Windows Components/Remote Desktop Services/Remote Desktop Session Host/Remote Session Environment/Enable RemoteFX encoding for RemoteFX clients designed for Windows Server 2008 R2 SP1

  4. Enable Computer Configuration/Administrative Templates/Windows Components/Remote Desktop Services/Remote Desktop Session Host/Remote Session Environment/Limit maximum color depth

  5. Reboot.

Architecture

See the ARCHITECTURE.md document.

Getting help