

欢迎使用纯PowerShell的远程桌面访问远程桌面!该模块提供了一种独特的解决方案,用于仅使用PowerShell远程控制一个或多个屏幕。与其他依赖外部协议和软件的远程桌面工具不同,我们的模块使用了自己的远程桌面协议。
该模块既由客户端和服务器组件组成,它们都完全用PowerShell编写。我们的协议使用TLS提供安全的加密通信,并提供基于挑战的密码身份验证和基于证书的身份验证。
除了在远程桌面上提供完整的鼠标和键盘控件外,我们的模块还为查看器复制了鼠标光标图标,将剪贴板在本地和远程系统之间同步,等等。尽管PowerShell受到了局限性,但我们已经实施了技术来优化网络流量并改善流媒体体验,从而带来了流畅有效的远程桌面体验。
在撰写本文时,这是唯一已知的完全基于PowerShell的远程桌面应用程序。我们希望您发现它有用,我们欢迎您可能会有的任何反馈或建议。
测试:
当前版本: 4.0.0稳定
为了获得更好的流媒体性能和整体体验,我们建议使用PowerShell 7代替PowerShell 5。
您可以在此处安装Windows的PowerShell 7

Install-Module - Name PowerRemoteDesktop_Server
Invoke-RemoteDesktopServer - CertificateFile " <certificate_location> "如果您想避免使用自己的证书,而不愿意不经历创建该证书的过程,则可以删除“证书文件”选项并将PowerShell作为管理员运行。
Install-Module - Name PowerRemoteDesktop_Viewer
Invoke-RemoteDesktopViewer - ServerAddress " <ip_address> " - Password " <the_one_displayed_on_server> "就是这样
有几种使用此PowerShell应用程序的方法。推荐的方法是使用PowerShell画廊同时安装服务器和查看器组件。另外,您可以将它们安装为模块,也可以手动将它们导入脚本。选择最适合您需求和偏好的方法。
您可以从PowerShell画廊中安装Power Remote桌面,该桌面类似于Debian或MacOS的酿造型。为此,请运行以下命令:
Install-Module - Name PowerRemoteDesktop_Server
Install-Module - Name PowerRemoteDesktop_Viewer当当前版本被标记为预发行时, AllowPrerelease是必不可少的
运行命令时,您可能会在命令提示符中看到以下警告:
Untrusted repository
You are installing the modules from an untrusted repository. If you trust this repository, change its
InstallationPolicy value by running the Set-PSRepository cmdlet. Are you sure you want to install the modules from
'PSGallery'?
键入“ y”以确认并继续安装。安装完成后,两个模块都应可用。您可以通过运行以下命令来验证这一点:
Get-Module - ListAvailable示例输出:
PS C:UsersPhrozenDesktop> Get-Module -ListAvailable
Directory: C:UsersPhrozenDocumentsWindowsPowerShellModules
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Manifest 1.0.0 PowerRemoteDesktop_Server Invoke-RemoteDesktopServer
Manifest 1.0.0 PowerRemoteDesktop_Viewer Invoke-RemoteDesktopViewer
<..snip..>
如果模块未显示,请尝试运行以下命令,然后再次检查:
Import-Module PowerRemoteDesktop_Server
Import-Module PowerRemoteDesktop_Viewer为了使模块可用,必须位于注册模块路径中。您可以通过运行以下命令来查看注册的模块路径:
Write-Output $ env: PSModulePath示例输出:
C:UsersPhrozenDocumentsWindowsPowerShellModules;C:Program FilesWindowsPowerShellModules;C:WINDOWSsystem32WindowsPowerShellv1.0Modules
Clone PowerRemotedEsktop存储库或下载GitHub版本包。
git clone https://github.com/DarkCoderSc/PowerRemoteDesktop.git
将PowerRemotedesktop_viewer和PowerRemotedesktop_server文件夹复制到所需的模块路径
例子:
C:Users<USER>DocumentsWindowsPowerShellModules
现在两个模块都应该可用,您可以使用命令验证:
Get-Module - ListAvailable示例输出:
PS C:UsersPhrozenDesktop> Get-Module -ListAvailable
Directory: C:UsersPhrozenDocumentsWindowsPowerShellModules
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Manifest 1.0.0 PowerRemoteDesktop_Server Invoke-RemoteDesktopServer
Manifest 1.0.0 PowerRemoteDesktop_Viewer Invoke-RemoteDesktopViewer
<..snip..>
如果您看不到它们,请运行以下命令并查看。
Import-Module PowerRemoteDesktop_Server
Import-Module PowerRemoteDesktop_Viewer注意:清单文件是可选的( *.psd1 ),可以删除。
并非必须将该应用程序作为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 ' )ETC...
PowerRemoteDesktop_Viewer.psm1需要导入 /或安装在本地计算机上。
Invoke-RemoteDesktopViewer
Get-TrustedServers
Remove-TrustedServer
Clear-TrustedServers 使用电源远程桌面服务器创建新的远程桌面会话。
| 范围 | 类型 | 默认 | 描述 |
|---|---|---|---|
| ServerAddress | 细绳 | 127.0.0.1 | 远程服务器主机或地址 |
| ServerPort | 整数 | 2801 | 远程服务器的端口号 |
| SecurePassword | Securestring | 没有任何 | Securestring对象包含用于使用远程服务器进行身份验证的密码(建议) |
| 密码 | 细绳 | 没有任何 | 用于使用远程服务器进行身份验证的普通文本密码(不建议使用;改用SecurePassword) |
| 禁用 | 转变 | 错误的 | 如果指定,该程序将抑制详细消息 |
| USETLSV1_3 | 转变 | 错误的 | 如果指定,该程序将使用TLS v1.3而不是TLS V1.2进行加密(如果两个系统都支持,则建议使用) |
| 剪贴板 | 枚举 | 两个都 | 指定剪贴板同步模式(选项包括'''',disabled','send''和'receart';请参见下文以获取更多详细信息) |
| 想象压缩 | 整数(0-100) | 75 | JPEG压缩水平从0(质量最低)到100(最高质量)不等 |
| 调整大小 | 转变 | 错误的 | 如果指定,将根据“ Resizeratio”选项调整远程桌面大小 |
| resizeratio | 整数(30-99) | 90 | 与“调整大小”选项结合使用,将调整大小比率指定为百分比 |
| 始终是座 | 转变 | 错误的 | 如果指定,虚拟桌面窗口将在所有其他窗口上方显示 |
| packetsize | 枚举 | 尺寸9216 | 指定流的网络数据包大小。选择适合您的网络约束的大小。 |
| 阻止 | 枚举 | 尺寸64 | 指定屏幕网格块的大小。选择适合远程屏幕尺寸和计算机资源的尺寸(例如CPU和网络功能) |
| logonui | 转变 | 错误的 | 请求服务器打开logonui/winlogon桌面而不是默认用户桌面(在活动会话中需要系统特权) |
| 价值 | 描述 |
|---|---|
| 禁用 | 剪贴板同步在查看器和服务器侧都被禁用 |
| 收到 | 仅允许传入的剪贴板数据 |
| 发送 | 仅允许传出剪贴板数据 |
| 两个都 | 在查看器和服务器侧都允许剪贴板同步 |
| 价值 | 描述 |
|---|---|
| size1024 | 1024字节(1KIB) |
| 尺寸2048 | 2048字节(2KIB) |
| 尺寸4096 | 4096字节(4KIB) |
| 尺寸8192 | 8192字节(8KIB) |
| 尺寸9216 | 9216字节(9KIB) |
| 尺寸12288 | 12288字节(12KIB) |
| 尺寸16384 | 16384字节(16KIB) |
| 价值 | 描述 |
|---|---|
| 尺寸32 | 32x32 |
| 尺寸64 | 64x64 |
| 尺寸96 | 96x96 |
| 尺寸128 | 128x128 |
| 尺寸256 | 256x256 |
| 尺寸512 | 512x512 |
建议使用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:UsersPhrozenDesktopProjectsPowerRemoteDesktop> Get-TrustedServers
Detail Fingerprint
------ -----------
@{FirstSeen=18/01/2022 19:40:24} D9F4637463445D6BB9F3EFBF08E06BE4C27035AF
@{FirstSeen=20/01/2022 15:52:33} 3FCBBFB37CF6A9C225F7F582F14AC4A4181BED53
@{FirstSeen=20/01/2022 16:32:14} EA88AADA402864D1864542F7F2A3C49E56F473B0
@{FirstSeen=21/01/2022 12:24:18} 3441CE337A59FC827466FC954F2530C76A3F8FE4
Remove-TrustedServer - Fingerprint " <target_ingerprint> " Clear-TrustedServersPowerRemoteDesktop_Server.psm1需要导入 /或安装在本地计算机上。
Invoke-RemoteDesktopServer | 范围 | 类型 | 默认 | 描述 |
|---|---|---|---|
| ServerAddress | 细绳 | 0.0.0.0 | IP地址表示本地机器的IP地址 |
| ServerPort | 整数 | 2801 | 聆听传入连接的端口号 |
| SecurePassword | Securestring | 没有任何 | Securestring对象包含用于身份验证远程查看器的密码(建议) |
| 密码 | 细绳 | 没有任何 | 用于身份验证远程查看器的普通文本密码(不推荐;改用Securepassword) |
| 禁用 | 转变 | 错误的 | 如果指定,该程序将抑制详细消息 |
| USETLSV1_3 | 转变 | 错误的 | 如果指定,该程序将使用TLS v1.3而不是TLS V1.2进行加密(如果两个系统都支持,则建议使用) |
| 剪贴板 | 枚举 | 两个都 | 指定剪贴板同步模式(选项包括'''',disabled','send''和'receart';请参见下文以获取更多详细信息) |
| 证书文件 | 细绳 | 没有任何 | 包含包括私钥的有效证书信息(x509)的文件 |
| 编码 | 细绳 | 没有任何 | 整个证书文件的base64编码表示形式,包括私钥 |
| 视图 | 转变 | 错误的 | 如果指定,远程查看器将只能查看桌面,并且无法访问鼠标或键盘 |
| 预防computertosleep | 转变 | 错误的 | 如果指定,此选项将阻止计算机在服务器处于活动状态并等待新连接时进入睡眠模式 |
| 证书通信 | Securestring | 没有任何 | 指定用于访问用户提供密码保护的X509证书的密码 |
| 价值 | 描述 |
|---|---|
| 127.0.0.1 | 仅听当地主机的连接(通常是出于调试目的) |
| 0.0.0.0 | 聆听所有网络接口上的连接,包括本地网络和Internet |
| 价值 | 描述 |
|---|---|
| 禁用 | 剪贴板同步在查看器和服务器侧都被禁用 |
| 收到 | 仅允许传入的剪贴板数据 |
| 发送 | 仅允许传出剪贴板数据 |
| 两个都 | 在查看器和服务器侧都允许剪贴板同步 |
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:certsphrozen.p12 " 从版本4.0.0开始,可以捕获logonui/winlogon(UAC提示,Windows登录窗口,Ctrl+Alt+Del等)。
但是,为了捕获logonui,必须在当前活动会话中的“ nt授权/系统”的上下文下运行服务器。
有多种方法可以在活动会话中作为系统用户(例如PSEXEC,Process Hacker)作为系统用户,但是为简单起见,我建议使用我的PowerRunassystem项目(可在Github上可用,可通过PowerShell Gallery安装)。
Install-Module - Name PowerRunAsSystem然后运行Bellow命令作为管理员。
Invoke-InteractiveSystemPowerShell新的Powershell终端应在您的桌面上以NT权限/系统出现
如果您按照上述步骤进行操作,则应在桌面上以“ NT Authority/System”用户的形式出现一个新的PowerShell终端。
在此终端中,您可以运行电源远程桌面服务器命令,并启用“ 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:tlscertphrozen.crt
使用PowerShell编码现有证书
[ convert ]::ToBase64String(( Get-Content - path " c:tlscertphrozen.crt " - Encoding byte))或在Linux / Mac系统上
base64 -i /tmp/phrozen.p12
然后,您可以将输出base64证书文件传递到参数EncodedCertificate (一行)


]和)正确发送和解释。? =容易? =中等? =硬
用❤️制成?