Project Icon

PowerRemoteDesktop

纯PowerShell实现的远程桌面控制工具

PowerRemoteDesktop是一款完全基于PowerShell开发的远程桌面控制工具。它采用TLS加密通信,支持多屏幕、剪贴板同步、鼠标键盘控制等功能,无需依赖外部协议和软件。该工具包含客户端和服务器组件,通过优化网络流量实现流畅的远程桌面体验。目前PowerRemoteDesktop是唯一已知的纯PowerShell远程桌面应用程序。

Power Remote Desktop

⚠️ 自2024年8月起,PowerRemoteDesktop已更名为Arcane,现可通过此官方仓库获取。当前仓库将不再维护。请务必收藏新仓库地址,如果觉得有用,请给个星标!

欢迎使用纯PowerShell编写的Power Remote Desktop远程桌面访问工具!本模块提供了一种独特的解决方案,仅使用PowerShell就能远程控制一个或多个屏幕。与其他依赖外部协议和软件的远程桌面工具不同,我们的模块使用自己的远程桌面协议。

该模块包含客户端和服务器组件,两者均完全用PowerShell编写。我们的协议使用TLS提供安全加密通信,并提供基于挑战的密码认证和基于证书的认证。

除了提供对远程桌面的完全鼠标和键盘控制外,我们的模块还为查看者复制鼠标光标图标,同步本地和远程系统之间的剪贴板,等等。尽管PowerShell存在限制,我们仍实施了优化网络流量和改善流媒体体验的技术,从而实现流畅高效的远程桌面体验。

据我们所知,这是目前唯一一个完全基于PowerShell的远程桌面应用。我们希望您能觉得它有用,也欢迎您提供任何反馈或建议。

测试通过平台:

  • Windows 10
  • Windows 11

当前版本:4.0.0 稳定版

性能

为获得更好的流媒体性能和整体体验,我们建议使用PowerShell 7而非PowerShell 5。

您可以在这里为Windows安装PowerShell 7。


主要特性

  • 远程桌面流媒体:此功能允许您将远程计算机的桌面流式传输到您自己的设备上。流媒体支持HDPI和缩放,在各种屏幕和分辨率上提供高质量显示。
  • 远程控制:通过此功能,您可以控制远程计算机的鼠标(包括移动、点击和滚轮)和键盘,就像您坐在它面前一样。
  • 安全性:为保护远程桌面会话的隐私和安全,该模块使用TLSv1.2或1.3加密网络流量。通过用户定义的复杂密码的挑战式认证机制授予对服务器的访问权限。
  • 网络流量加密:该模块支持使用默认X509证书(需要管理员权限)或您自己的自定义X509证书加密网络流量。
  • 服务器证书指纹验证:为确保服务器的真实性,该模块允许您验证服务器证书的指纹,并可选择在会话之间保留此验证。
  • 剪贴板同步:此功能允许您在查看器(您的设备)和服务器(远程计算机)之间同步剪贴板文本。您可以轻松地在两个系统之间复制和粘贴文本。
  • 鼠标光标图标同步:该模块还同步查看器(虚拟桌面)和服务器之间的鼠标光标图标状态,提供更流畅直观的远程桌面体验。
  • 多屏幕支持:如果远程计算机有多个桌面屏幕,您可以选择要捕获和流式传输到您设备的屏幕。
  • 仅查看模式:此功能允许您禁用远程控制功能,仅查看远程计算机的屏幕。这对演示或展示很有用。
  • 会话并发:多个查看器可以同时连接到单个服务器,允许多个用户在同一远程桌面上协作。
  • 防止睡眠模式:为确保远程桌面保持活跃和响应,该模块在等待查看器连接时防止远程计算机进入睡眠模式。
  • 流媒体优化:为提高流媒体速度,该模块仅向查看器发送桌面的更新部分,减少通过网络传输的数据量。

一分钟内完成所有设置(快速设置)

Install-Module -Name PowerRemoteDesktop_Server

Invoke-RemoteDesktopServer -CertificateFile "<证书位置>"

如果您不想使用自己的证书,也不想创建一个,可以移除'CertificateFile'选项,并以管理员身份运行PowerShell。

Install-Module -Name PowerRemoteDesktop_Viewer

Invoke-RemoteDesktopViewer -ServerAddress "<IP地址>" -Password "<服务器显示的密码>"

就这么简单 😉


详细安装和说明

有几种方法可以使用这个PowerShell应用程序。推荐的方法是使用PowerShell Gallery安装服务器和查看器组件。或者,您可以将它们作为模块安装或手动导入它们作为脚本。选择最适合您需求和偏好的方法。

从PowerShell Gallery安装为PowerShell模块(推荐

您可以从PowerShell Gallery安装Power Remote Desktop,类似于Debian的Aptitude或MacOS的Brew。要这样做,请运行以下命令:

Install-Module -Name PowerRemoteDesktop_Server

Install-Module -Name PowerRemoteDesktop_Viewer

当当前版本标记为预发布时,AllowPrerelease是必需的。

运行命令时,您可能会在命令提示符中看到以下警告:

不受信任的存储库
您正在从不受信任的存储库安装模块。如果您信任此存储库,请通过运行Set-PSRepository cmdlet更改其
InstallationPolicy值。您确定要从'PSGallery'安装模块吗?

输入'Y'确认并继续安装。安装完成后,两个模块都应该可用。您可以通过运行以下命令进行验证:

Get-Module -ListAvailable

示例输出:

PS C:\Users\Phrozen\Desktop> Get-Module -ListAvailable


    目录:C:\Users\Phrozen\Documents\WindowsPowerShell\Modules


ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   1.0.0      PowerRemoteDesktop_Server           Invoke-RemoteDesktopServer
Manifest   1.0.0      PowerRemoteDesktop_Viewer           Invoke-RemoteDesktopViewer

<..省略..>

如果模块没有显示出来,请尝试运行以下命令,然后再次检查:

Import-Module PowerRemoteDesktop_Server

Import-Module PowerRemoteDesktop_Viewer

手动安装为PowerShell模块(非托管)

为了使模块可用,它必须位于已注册的模块路径中。您可以通过运行以下命令查看已注册的模块路径:

Write-Output $env:PSModulePath

示例输出:

C:\Users\Phrozen\Documents\WindowsPowerShell\Modules;C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules

克隆PowerRemoteDesktop仓库或下载Github发布包。

git clone https://github.com/DarkCoderSc/PowerRemoteDesktop.git

将PowerRemoteDesktop_Viewer和PowerRemoteDesktop_Server文件夹复制到所需的模块路径

示例:

C:\Users\<USER>\Documents\WindowsPowerShell\Modules

现在应该可以使用这两个模块了,可以使用以下命令进行验证:

Get-Module -ListAvailable

示例输出:

PS C:\Users\Phrozen\Desktop> Get-Module -ListAvailable


    目录: C:\Users\Phrozen\Documents\WindowsPowerShell\Modules


ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   1.0.0      PowerRemoteDesktop_Server           Invoke-RemoteDesktopServer
Manifest   1.0.0      PowerRemoteDesktop_Viewer           Invoke-RemoteDesktopViewer

<..省略..>

如果没有看到它们,运行以下命令并重新检查。

Import-Module PowerRemoteDesktop_Server

Import-Module PowerRemoteDesktop_Viewer

注意:清单文件(*.psd1)是可选的,可以删除。

作为PowerShell脚本

不强制要求将此应用程序安装为PowerShell模块(即使文件扩展名是*.psm1)

你也可以将其作为PowerShell脚本加载。有多种方法,包括:

使用以下方式调用命令:

IEX (Get-Content .\PowerRemoteDesktop_[Server/Viewer].psm1 -Raw)

从远程位置加载脚本:

IEX (New-Object Net.WebClient).DownloadString('http://127.0.0.1/PowerRemoteDesktop_[Server/Viewer].psm1')

等等...

使用方法

客户端

需要在本地机器上导入或安装PowerRemoteDesktop_Viewer.psm1。

可用的模块函数

Invoke-RemoteDesktopViewer
Get-TrustedServers
Remove-TrustedServer
Clear-TrustedServers 

Invoke-RemoteDesktopViewer

与Power Remote Desktop服务器创建新的远程桌面会话。

⚙️ 支持的选项:
参数类型默认值描述
ServerAddress字符串127.0.0.1远程服务器主机或地址
ServerPort整数2801远程服务器的端口号
SecurePasswordSecureString包含用于远程服务器身份验证的密码的SecureString对象(推荐)
Password字符串用于远程服务器身份验证的明文密码(不推荐;请改用SecurePassword)
DisableVerbosity开关False如果指定,程序将抑制详细输出消息
UseTLSv1_3开关False如果指定,程序将使用TLS v1.3而不是TLS v1.2进行加密(如果两个系统都支持,则推荐使用)
Clipboard枚举Both指定剪贴板同步模式(选项包括'Both'、'Disabled'、'Send'和'Receive';详见下文)
ImageCompressionQuality整数 (0-100)75JPEG压缩级别,范围从0(最低质量)到100(最高质量)
Resize开关False如果指定,远程桌面将根据'ResizeRatio'选项调整大小
ResizeRatio整数 (30-99)90与'Resize'选项一起使用,指定调整大小的比例(百分比)
AlwaysOnTop开关False如果指定,虚拟桌面窗口将显示在所有其他窗口之上
PacketSize枚举Size9216指定流的网络数据包大小。选择适合您网络限制的大小。
BlockSize枚举Size64指定屏幕网格块的大小。选择适合远程屏幕大小和计算机资源(如CPU和网络能力)的大小
LogonUI开关False请求服务器打开LogonUI/Winlogon桌面,而不是默认用户桌面(在活动会话中需要SYSTEM权限)
剪贴板模式枚举属性
描述
Disabled在查看器和服务器端都禁用剪贴板同步
Receive只允许接收剪贴板数据
Send只允许发送剪贴板数据
Both在查看器和服务器端都允许剪贴板同步
PacketSize模式枚举属性
描述
Size10241024字节 (1KiB)
Size20482048字节 (2KiB)
Size40964096字节 (4KiB)
Size81928192字节 (8KiB)
Size92169216字节 (9KiB)
Size1228812288字节 (12KiB)
Size1638416384字节 (16KiB)
BlockSize模式枚举属性
描述
Size3232x32
Size6464x64
Size9696x96
Size128128x128
Size256256x256
Size512512x512
⚠️ 重要提示

建议使用SecurePassword而不是明文密码,即使明文密码正在转换为SecureString

示例

使用密码'urCompl3xP@ssw0rd'打开到'127.0.0.1:2801'的新远程桌面会话

Invoke-RemoteDesktopViewer -ServerAddress "127.0.0.1" -ServerPort 2801 -SecurePassword (ConvertTo-SecureString -String "urCompl3xP@ssw0rd" -AsPlainText -Force)

枚举受信任的服务器

首次连接到新的远程服务器时,查看器会询问是否信任服务器的指纹。如果选择"始终"信任此指纹,它将被保存在本地用户注册表中。您可以随时使用适当的函数撤销对此指纹的信任。

Get-TrustedServers

示例输出:

PS C:\Users\Phrozen\Desktop\Projects\PowerRemoteDesktop> Get-TrustedServers
详细信息                        指纹
------                           -----------
@{FirstSeen=2022/01/18 19:40:24} D9F4637463445D6BB9F3EFBF08E06BE4C27035AF
@{FirstSeen=2022/01/20 15:52:33} 3FCBBFB37CF6A9C225F7F582F14AC4A4181BED53
@{FirstSeen=2022/01/20 16:32:14} EA88AADA402864D1864542F7F2A3C49E56F473B0
@{FirstSeen=2022/01/21 12:24:18} 3441CE337A59FC827466FC954F2530C76A3F8FE4

### 永久删除受信任的服务器

```powershell
Remove-TrustedServer -Fingerprint "<目标指纹>"
```

### 永久删除所有受信任的服务器(清除)

```powershell
Clear-TrustedServers
```

---

### 服务器

需要在本地机器上导入或安装`PowerRemoteDesktop_Server.psm1`。

#### 可用的模块函数

```powershell
Invoke-RemoteDesktopServer
```

##### ⚙️ 支持的选项:

| 参数                    | 类型             | 默认值     | 描述  |
|------------------------|------------------|------------|--------------|
| ServerAddress          | 字符串           | 0.0.0.0    | 表示本地机器IP地址的IP地址 |
| ServerPort             | 整数             | 2801       | 用于监听传入连接的端口号 |
| SecurePassword         | SecureString     | 无         | 包含用于验证远程查看器的密码的SecureString对象(推荐) |
| Password               | 字符串           | 无         | 用于验证远程查看器的明文密码(不推荐;请使用SecurePassword) |
| DisableVerbosity       | 开关             | False      | 如果指定,程序将抑制详细信息消息 |
| UseTLSv1_3             | 开关             | False      | 如果指定,程序将使用TLS v1.3而不是TLS v1.2进行加密(如果两个系统都支持,则推荐) |
| Clipboard              | 枚举             | Both       | 指定剪贴板同步模式(选项包括"Both"、"Disabled"、"Send"和"Receive";详细信息见下文) |
| CertificateFile        | 字符串           | 无         | 包含有效证书信息(x509)的文件,包括私钥 |
| EncodedCertificate     | 字符串           | 无         | 整个证书文件的base64编码表示,包括私钥 |
| ViewOnly               | 开关             | False      | 如果指定,远程查看器将只能查看桌面,无法访问鼠标或键盘 |
| PreventComputerToSleep | 开关             | False      | 如果指定,此选项将在服务器处于活动状态并等待新连接时阻止计算机进入睡眠模式 |
| CertificatePassword    | SecureString     | 无         | 指定用于访问用户提供的受密码保护的x509证书的密码 |

##### 服务器地址示例

| 值                | 描述                                                              | 
|-------------------|--------------------------------------------------------------------------|
| 127.0.0.1         | 仅监听来自本地主机的连接(通常用于调试目的) |
| 0.0.0.0           | 监听所有网络接口的连接,包括本地网络和互联网                       |

##### 剪贴板模式枚举属性

| 值                | 描述                                        | 
|-------------------|----------------------------------------------------|
| Disabled          | 在查看器和服务器端都禁用剪贴板同步 |
| Receive           | 仅允许传入的剪贴板数据                |
| Send              | 仅允许传出的剪贴板数据                 |
| Both              | 在查看器和服务器端都允许剪贴板同步  |

##### ⚠️ 重要提示

1. 建议使用SecurePassword而不是明文密码,即使明文密码正在转换为SecureString。
2. 如果您没有使用"CertificateFile"或"EncodedCertificate"指定自定义证书,将在本地机器上生成并安装默认的自签名证书(如果尚不存在)。这需要管理员权限。要使用非特权帐户运行服务器,您必须提供自己的证书位置。
3. 如果您没有指定SecurePassword或Password,将生成并在终端中显示一个随机的复杂密码(此密码是临时的)。

##### 示例

```powershell
Invoke-RemoteDesktopServer -ListenAddress "0.0.0.0" -ListenPort 2801 -SecurePassword (ConvertTo-SecureString -String "urCompl3xP@ssw0rd" -AsPlainText -Force)

Invoke-RemoteDesktopServer -ListenAddress "0.0.0.0" -ListenPort 2801 -SecurePassword (ConvertTo-SecureString -String "urCompl3xP@ssw0rd" -AsPlainText -Force) -CertificateFile "c:\certs\phrozen.p12"
```

#### 如何捕获LogonUI

从4.0.0版本开始,可以捕获LogonUI/Winlogon(UAC提示、Windows登录窗口、CTRL+ALT+DEL等)。

但是,为了捕获LogonUI,服务器必须在当前活动会话中以"NT AUTHORITY/System"的上下文运行。

有多种方法可以在活动会话中以SYSTEM用户身份生成进程(例如PsExec、Process Hacker),但为了简单起见,我推荐使用我的PowerRunAsSystem项目(可在GitHub上获取,并可通过PowerShell Gallery安装)。

```powershell
Install-Module -Name PowerRunAsSystem
```

然后以管理员身份运行以下命令。

```powershell
Invoke-InteractiveSystemPowerShell
```

一个新的PowerShell终端应该会以**NT AUTHORITY/System**身份出现在您的桌面上。

如果您按照上述步骤操作,一个新的PowerShell终端应该会以"NT AUTHORITY/System"用户身份出现在您的桌面上。

从这个终端,您可以运行Power Remote Desktop服务器命令,并为将来的Power Remote Desktop查看器连接启用"LogonUI"选项。

值得注意的是,如果您不使用自己的X509证书,您将需要管理员权限来创建新服务器。但是,您可以使用诸如OpenSSL命令行工具等工具轻松创建自己的X509证书。

##### 生成您的证书

```
openssl req -x509 -sha512 -nodes -days 365 -newkey rsa:4096 -keyout phrozen.key -out phrozen.crt
```

然后导出新证书(**必须包含私钥**)。

```
openssl pkcs12 -export -out phrozen.p12 -inkey phrozen.key -in phrozen.crt
```

##### 作为文件集成到服务器

使用`CertificateFile`。示例:`c:\tlscert\phrozen.crt`

##### 作为base64表示集成到服务器

使用PowerShell对现有证书进行编码

```powershell
[convert]::ToBase64String((Get-Content -path "c:\tlscert\phrozen.crt" -Encoding byte))
```

或在Linux / Mac系统上

```
base64 -i /tmp/phrozen.p12
```

然后您可以将输出的base64证书文件传递给参数`EncodedCertificate`(一行)

## 更新日志

### 2022年1月11日(1.0.1 Beta 2)
* 桌面图像现在以原始字节而非base64字符串传输,从而略微提升了性能。
* 协议发生了大幅改变。现在更易读且不易出错。
* 增加了TLS v1.3选项(某些系统可能不支持)。
* 进行了多项代码优化、重构和修复。
* 实施了密码复杂度检查,以避免使用简单密码。
* 可以禁用详细输出。
* 服务器和查看器版本同步。两者必须使用相同版本。

### 2022年1月12日(1.0.2 Beta 3)

* 完全支持HDPI。

### 2022年1月12日(1.0.3 Beta 4)

* 可以更改桌面图像质量。
* 如果远程机器有多个屏幕(显示器),可以选择要捕获的屏幕。

#### 多屏幕选择

![多屏幕示例](https://yellow-cdn.veclightyear.com/0a4dffa0/dbd4c81e-5a5f-43e0-948a-44a35d412a35.png)

### 2022年1月14日(1.0.4 Beta 5)

* 查看器中的密码以SecureString形式存储。我认为在服务器端实现SecureString没有意义,如果你认为有必要,请说服我。
* 服务器指纹验证。
* 可以为当前PowerShell实例信任服务器,或使用本地存储持久信任。
* 可以管理受信任的服务器(列出、删除、删除所有)

#### 指纹验证

![服务器指纹验证](https://yellow-cdn.veclightyear.com/0a4dffa0/94a32505-b69e-4ebe-95e0-6400b4d69454.png)

### 2022年1月18日(1.0.5 Beta 6)

* 多项代码改进以支持传入/传出事件。
* 实现了全局光标状态同步(现在虚拟桌面鼠标光标与远程服务器相同)。
* 修复了密码生成器算法。
* 虚拟键盘的`]`和`)`键可正确发送和解释。
* 添加了查看器 <-> 服务器的剪贴板同步。
* 服务器支持新选项,仅显示桌面(在此模式下禁用鼠标移动、点击、滚轮和键盘控制)。

### 2022年1月21日(1.0.6)

* 移除了TransportMode选项。
* 提高了桌面流的性能/速度。

### 2022年1月28日(2.0.0)

* 协议完全重新设计,现在更稳定和模块化。
* 现在支持会话并发,多个查看器可以同时连接到一个服务器。
* 可以使用CTRL+C停止服务器
* 图像质量现在由查看器请求。
* 桌面重新调整大小现在在服务器端进行。
* 查看器现在可以强制请求桌面重新调整大小。
* 修复了虚拟桌面居中的故障。
* 握手调用(身份验证 + 会话/工作器协商)现在会超时,以避免可能的死锁。
* 虚拟桌面窗体现在可以始终置于其他窗体之上。
* 服务器最终使用安全字符串来处理密码认证。

### 2022年2月9日(3.0.0)

* 防止服务器端计算机进入睡眠状态。
* 首次支持动作更新,以提高桌面流速度。
* 在某些情况下鼠标移动如预期工作。
* 改进了键盘模拟。
* 各种优化和修复。

### 2022年2月10日(3.1.0)

* 代码重构和改进。
* 改进桌面流以获得更多FPS。
* 支持密码保护的外部x509证书。

### 2022年3月10日(4.0.0)

* 大幅优化桌面流,FPS提高65%(如果调整BlockSize,甚至更多)
* 桌面重新调整大小现在在查看器端自动进行,以简化代码和提高效率。
* 不再需要FastResize选项。
* 各种代码优化/修复。
* 支持WIN键盘键。
* 虚拟桌面窗口在终端之上打开。
* 服务器现在支持LogonUI / Winlogon(测试版)

### 想法和待办事项列表

* 🟢 SSL/TLS的相互认证(客户端证书)                
* 🟠 当本地分辨率发生变化时中断会话。
* 🔴 LogonUI支持。

🟢 = 简单
🟠 = 中等
🔴 = 困难

用❤️在🇫🇷制作
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号