一、背景:运维中遇到的几个实际问题
在管理一批 Windows 服务器(十几台到上百台)时,会反复遇到几个问题:
1、远控工具不统一:有的服务器走 RustDesk,有的走 MsTSC(微软远程桌面),内网环境还有 Radmin、RealVNC,桌面上要来回切换多个客户端;
2、连接记录分散:IP、端口、账号、密码记在不同地方,每次连接都要重新输入;
3、远端锁屏后操作繁琐:部分安全策略要求远端锁屏,连上之后还要手动解锁;
4、设备状态不直观:哪些服务器在线、哪些离线,只能逐个连一遍才知道。
为此,我把日常的运维流程整理成了一个统一管理工具 UnifyRemoteManager(统一远程连接自动登录管理器,简称 URM)。本文只记录它的设计思路和实现要点,供有同样需求的同学参考。
二、整体设计思路
核心思路是“统一记录 + 外部进程调用”:
- 每一条连接记录包含:名称、远程工具类型、IP、端口、账号、密码、显示参数等字段;
- 一条记录对应一种远程工具,双击时由程序自动调用对应的客户端(RustDesk / MsTSC / RealVNC / Radmin),并把连接信息传过去;
- 程序本身不重复实现远程桌面协议,只通过外部进程方式调用各客户端,不集成任何客户端的源代码。
三、关键功能的实现思路
1、自动登录
双击记录后,程序以命令行参数启动对应客户端,再通过窗口句柄定位登录窗口,把账号密码自动填入,无需手动敲键盘。
2、远程桌面自动解锁
连接成功后,如果远端处于锁屏状态,程序会定位登录界面的密码输入框并完成解锁。解锁前还可以选择“先锁定再解锁”(LockThenUnlock),避免操作过程中明文密码停留在桌面上;操作结束后可以一键把远端锁屏。
3、批量 TCP 扫描
扫描功能按记录的 IP 和端口做 TCP 连通性探测:
- 多线程并发探测,每条记录超时 5 秒,避免串行等待;
- 探测结果直接反映在列表里:在线高亮、离线灰显,并用不同图标区分工具类型。
4、密码加密存储
记录密码使用 AES-256-CBC 加密后存储,不写明文;程序启动时会自动识别旧版 RC4 加密的数据并一次性升级为 AES-256。导出的 CSV 文件里,密码字段也只是一串密文。
5、记录管理与多语言
- 记录以 CSV 格式标准化存储,支持批量导入导出,便于备份和迁移;
- 提供列表、图标、详情三种视图和树状目录;
- 浅色、深色、自动三种主题;界面语言通过外置语言文件动态切换,修改后即时生效,也可以自行翻译新增语言。
四、运行环境
- 基于 Qt5 C++ 开发,x64 编译,Qt5 运行库随程序提供,资源和配置文件位于 res\ 目录;
- 支持 64 位 Windows 7 / 8 / 8.1 / 10 / 11 及对应 Windows Server;
- 程序以管理员权限运行(部分功能依赖),启动时 UAC 弹窗选“是”;
- 远程客户端需要自行部署:
- Radmin:将 Radmin.exe 放入 res\RemoteSoft\Radmin\;
- RealVNC:将 VncViewer.exe 放入 res\RemoteSoft\realVNC\;
- MsTSC:将 mstsc.exe 及对应语言包放入 res\RemoteSoft\MsTSC\mstsc\;
- RustDesk:可使用自行编译的增强版(仅外部进程调用),或把已安装的 RustDesk 目录拷入 res\RemoteSoft\RustDesk\;
- 需在防火墙放行相关程序;个别安全软件可能误报,可加入白名单。
五、关于开源与合规
- 对 RustDesk 的调用仅为外部进程方式,未集成其源代码;
- 自行编译的 RustDesk 增强版基于官方开源代码衍生,遵循 AGPL-3.0,相关源代码托管在 GitHub:https://github.com/patton88/RustDesk_plugin01
六、下载地址
百度网盘:https://pan.baidu.com/s/1HiRQhR-tabLEMwyKjlCzpg?pwd=ue78
提取码:ue78
蓝奏网盘:https://wwbxj.lanzoul.com/i2bP24cvizlc?pwd=43n0
密码:43n0
解压后双击 UnifyRemoteManager.exe 即可运行,无需安装;帮助文档可在程序内按 F1 查看
(UnifyRemoteManager_Help_zh_CN.txt 位于 res\language\text\ 目录)。
七、功能介绍视频
https://www.bilibili.com/video/BV1VFnP6HEU8
https://v.douyin.com/CibUWnGAfyM/
八、写在最后
这类工具仅用于合法的远程运维场景,请遵守国家法律法规,不要用于未经授权的访问。如果在自己的环境中遇到类似问题,希望本文的思路能提供参考。