简介:面向需要在Windows上实现多用户并发远程桌面连接的系统管理员、运维人员与进阶个人用户,这份RDPWrap工具包提供绕过RDS默认单会话限制的完整方案,可用于让多台电脑同时登录同一主机的不同本地账户。压缩包共71个文件、约5.81MB,以29个exe可执行程序、14个ps1脚本、8个bat批处理及ini配置、txt说明等为主,兼顾安装配置、服务检测、自动更新与卸载清理等环节,另有dll与chm文档辅助部署和排错。已有900人学习下载,说明其在远程办公与多会话实验场景中具有一定参考价值。使用者可据此完成并发RDP的安装、状态检查、配置更新与多账户登录验证,并了解兼容性维护和安全注意事项,适合希望低成本搭建多用户远程桌面环境、同时需要明确许可与安全风险的技术人员按需取用。
1. RDPWrap 补的是 termsrv.dll,不是给你装一个远程软件
某实验室一台办公机,Windows 10 22H2 打完月度更新重启,远程桌面就登不上了。打开 RDPConf 一看,Wrapper state 还是 Installed,Service state 也是 Running,唯独 Listener state 变成了 Not listening。折腾半天才定位到:更新把 termsrv.dll 的版本号顶到了新号,rdpwrap.ini 里没有对应的节,补丁打不上去,3389 自然不监听。这就是 windows 远程 RDPWrap 最常见的出错方式——装的时候一切正常,一次系统更新就会恢复原状。它本身不是远程桌面软件,做的是一层壳:把 rdpwrap.dll 挂进终端服务进程,改掉 termsrv.dll 对并发会话的限制。装它之前先接受一个前提:它跟系统补丁版本紧密绑定,装完需要持续关注,很难一次装完就不用管。
2. 安装前把三件事盘清:Windows 版本、termsrv.dll 号、.NET
RDPWrap 装不上,八成不是 install.bat 点错了,而是前置条件没对齐。它不像普通软件那样“双击下一步”,本质上是一次针对系统文件的运行时打补丁,任何一项对不上,表现都是同一个:RDPConf 里 Listener state 显示 Not listening。所以在解压之前,先把系统版本、termsrv.dll 版本号和运行库这三件事查清楚,后面能省掉一大半排查时间。
2.1 查 termsrv.dll 版本:决定 rdpwrap.ini 能不能对上
rdpwrap.ini 是以 termsrv.dll 的文件版本号分节的,节名长这样:[10.0.19041.2673]。RDPWrap 启动时读当前系统 termsrv.dll 的版本,拿这串号去 ini 里找同名节;找不到就跳过 patch,什么也不做,也不报错。所以第一步永远是拿到准确的版本号。
# 以管理员身份打开 PowerShell,读取终端服务核心 dll 的版本 (Get-Item "$env:SystemRoot\System32\termsrv.dll").VersionInfo.FileVersion # 同时看一眼系统内部版本,方便和 ini 里的节名交叉核对 [System.Environment]::OSVersion.Version # 想看更完整的系统信息(这条慢,能不用就不用) Get-ComputerInfo -Property OsName, OsVersion, OsBuildNumber第一条命令返回的通常是10.0.19041.2673 (WinBuild.160101.0800)这种格式,括号前面那一段10.0.19041.2673就是 ini 里要找的节名,一个字符都不能差。$env:SystemRoot指向系统盘下的 Windows 目录,写成死路径C:\Windows也行,但遇到系统盘不在 C 的机器就会出错,用环境变量更稳。第二条命令给出的是 OS 版本,Windows 10 22H2 是 10.0.19045.x,Windows 11 23H2 是 10.0.22631.x,24H2 是 10.0.26100.x,它跟 termsrv.dll 的版本不一定完全一致——系统打完补丁,dll 版本号会往前顶,OS 版本号却可能不动,所以以第一条命令的结果为准。
查完之后,打开包里的 rdpwrap.ini,用编辑器的搜索功能直接搜这串号。搜得到,说明 ini 覆盖了你这个版本,安装成功率很高;搜不到,先别急着装,去把 ini 换成更新的版本再动手。这一步花两分钟,能挡掉后面两小时的折腾。
2.2 .NET Framework 与杀软白名单:RDPConf 打不开的两个原因
RDPConf.exe 和 RDPCheck.exe 都是 .NET 写的图形界面程序。Windows 10 和 Windows 11 自带 .NET Framework 4.8,直接能跑;Windows 7、Windows 8.1 或者被精简过的系统镜像,很可能只留了 3.5,双击 RDPConf 会没有任何反应,连报错窗口都不弹。这种情况不用怀疑 RDPWrap 坏了,先补运行库。
# 查看当前系统安装了哪些 .NET Framework 版本(看 Release 键值) Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" -Name Release, Version # Windows 7/8.1 上启用 .NET Framework 4.x 功能(需要联网或本地源) DISM /Online /Enable-Feature /FeatureName:NetFx4 /AllRelease键值 528040 及以上对应 4.8,461808 对应 4.7.2,低于 393295 说明 4.x 根本没装。DISM那条命令在 Win10/11 上一般不需要执行,只在老系统上补功能时用,/All表示同时启用父级功能,/Online表示针对当前运行的系统而不是离线镜像。
第二个前置条件是杀软。RDPWInst.exe 会往 System32 目录写东西,rdpwrap.dll 会被注入到 svchost 里跑的终端服务进程中,这两条行为在很多杀软的启发式规则里都属于高危,误报率很高。常见做法是:解压之前先把整个 RDPWrap 目录加进杀软的排除列表,装完再把实时防护恢复回去,别为了装个工具把机器裸奔一整天。加排除的位置在杀软的“设置 → 排除项 → 添加文件夹”,把解压后的目录整个加进去,而不是只加单个 exe,因为 dll 和 ini 也可能被单独干掉。
2.3 目录与权限:别放桌面、别放中文路径
解压路径建议固定成C:\RDPWrap或者D:\Tools\RDPWrap,不要放桌面,不要放“下载”目录,更不要放在带中文或空格的路径里。install.bat 内部是一串批处理调用,路径里带空格时如果某处引号没包好,命令会被截断,表现就是窗口一闪而过、什么都没发生。中文路径在部分代码页下同样会出问题。
权限这块没得商量:install.bat、RDPWInst.exe、RDPConf.exe 全部要右键“以管理员身份运行”。RDPWInst 需要写C:\Program Files\RDP Wrapper\、需要操作服务、需要碰 System32 下的文件,普通权限下它会静默失败,RDPConf 里 Wrapper state 一直是 Not installed,你还以为是 ini 的问题。判断当前是不是管理员,可以在 PowerShell 里跑一句([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator),返回 True 才继续往下走。
还有一点容易被忽略:如果机器上装过旧版本的 RDPWrap,先跑一遍uninstall.bat再装新的,别直接在旧目录上覆盖解压。旧版本残留的服务注册项会让新装的 dll 加载不上,这种现象在 RDPConf 里看不出来,只能靠先卸载规避。
3. 执行安装:install.bat 到底改了什么
前面三件事对齐之后,安装动作本身其实只有几十秒。但很多人装完心里没底,就是因为不知道那几个 bat 到底动了系统的哪些地方。搞清楚它干了什么,后面出问题才知道从哪回滚。
3.1 解压与以管理员身份跑 install.bat
包里一般有这么几个文件:install.bat、uninstall.bat、update.bat、RDPWInst.exe、RDPConf.exe、RDPCheck.exe、rdpwrap.dll、rdpwrap.ini。核心只有两个:RDPWInst.exe 是安装器,rdpwrap.ini 是版本补丁表,其余都是包装。
# 进入解压目录(路径按自己的来) cd /d C:\RDPWrap # 以管理员身份运行安装脚本 install.bat # install.bat 内部实际执行的就是这一条,遇到脚本被改坏时可以直接调 RDPWInst.exe -iinstall.bat里没有黑魔法,内容基本就是RDPWInst.exe -i加一个pause,让你能看见输出。-i是 install 的意思,做四件事:把 rdpwrap.dll 复制到C:\Program Files\RDP Wrapper\,把 rdpwrap.ini 一起复制过去,注册一个名为 RDPWrapper 的服务,并修改终端服务的加载配置让它去加载这个 dll。对应的-u是卸载,会删文件、删服务、恢复配置。如果你之前装过又装了一遍,用-r重新安装更干净,它会先卸再装。
装完先别急着开 RDPConf,去C:\Program Files\RDP Wrapper\看一眼,目录里应该有rdpwrap.dll、rdpwrap.ini、RDPWInst.exe三个文件。少一个都说明安装没走完,最常见的原因是杀软在复制过程中把 dll 吃了。
3.2 rdpwrap.ini 的分节匹配规则与 update.bat
rdpwrap.ini 是这个工具里唯一需要长期维护的文件。它的结构是按 dll 版本分节,每一节里写一组偏移量和补丁开关。
; rdpwrap.ini 片段,节名必须和 termsrv.dll 的版本号完全一致 [10.0.19041.2673] ; 是否启用单用户补丁(x64 平台) SingleUserPatch.x64=1 ; 单用户补丁在 dll 中的偏移地址,由社区逆向得出 SingleUserOffset.x64=0x1A2B3C ; 是否启用多用户并发补丁 DefPolicyPatch.x64=1 DefPolicyOffset.x64=0x2D4E5F节名是匹配的唯一依据,10.0.19041.2673和10.0.19041.2674在它眼里是两个完全不同的系统,差一个数字就整节失效。每个键值后面的x64表示只对 64 位系统生效,32 位系统对应的是x86后缀,现在基本遇不到了。SingleUserPatch控制单会话行为,DefPolicyPatch控制并发会话策略,偏移量是社区根据该版本 dll 逆向出来的固定地址,所以 ini 必须跟着系统补丁走,不能通用。
update.bat的作用是联网去拉最新的 ini 覆盖本地文件。这条路径能不能走通取决于网络环境,很多内网机器直接失败,窗口一闪就没了。比较稳妥的替代做法是:手动去社区维护的 ini 仓库下载最新的rdpwrap.ini,覆盖C:\Program Files\RDP Wrapper\下的同名文件,然后按 4.2 节的顺序重装一遍。手动覆盖虽然笨,但每一步都可控,出问题也知道是哪一步。
3.3 放行 3389 与“允许远程连接”的最小改动
RDPWrap 只管并发会话,不管端口开不开。装完之后如果 3389 没放行,或者系统层面压根没允许远程桌面,RDPConf 可能显示 Listening,但你从别的机器连过来照样超时。
# 系统层面允许远程桌面连接(家庭版没有这个注册表项,跳过即可) Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' ` -Name 'fDenyTSConnections' -Value 0 -Type DWord # 防火墙放行入站 3389/TCP,只对专用网络生效 New-NetFirewallRule -DisplayName "RDP-3389-In" -Direction Inbound ` -Protocol TCP -LocalPort 3389 -Action Allow -Profile Domain,PrivatefDenyTSConnections为 0 表示允许远程连接,为 1 表示拒绝,这个键改完不需要重启,但终端服务会读一次缓存,稳妥起见重启一次 TermService。防火墙那条规则里-Profile Domain,Private限定只对域网络和专用网络生效,公共网络不放行,避免在咖啡厅连 Wi-Fi 时把 3389 暴露出去。如果你的机器需要在公共网络下被连,再单独加一条规则,别图省事用-Profile Any。
另外提醒一句,多用户并发登录在授权层面要按相应许可要求执行,这里只谈技术上的配置与验证。
4. 把状态调到 Listening:RDPConf 三项状态逐条对
装完之后所有判断都落在 RDPConf.exe 这一个窗口上。它显示三行状态,很多人只盯着最后一行看,其实三行是有先后依赖的,前面不对,后面一定不对。
4.1 Wrapper / Service / Listener 三项状态的读法
| 状态项 | 正常值 | 异常值 | 异常时的含义 | 优先排查方向 |
|---|---|---|---|---|
| Wrapper state | Installed | Not installed | rdpwrap.dll 没被终端服务加载 | 安装是否成功、杀软是否拦截、是否管理员运行 |
| Service state | Running | Stopped | TermService 没起来 | 服务被禁用、系统文件损坏 |
| Listener state | Listening | Not listening | 3389 没进入监听 | ini 是否匹配当前 dll 版本 |
读的顺序是从上往下。Wrapper state 是 Not installed,说明壳根本没挂上,这时候看 Listener 没有意义;Service state 是 Stopped,先去服务管理器把 Remote Desktop Services 启起来;只有前两项都正常、Listener 还是 Not listening,才是 ini 版本不匹配的问题,这才是需要换 ini 的场景。分清楚这个顺序,能避免一上来就到处找 ini 的无效操作。
RDPConf 下方还有一行显示当前 dll 版本和已加载的 ini 节,装对了会显示类似10.0.19041.2673的字样,跟你 2.1 节查到的版本号一致才算真对上。
4.2 手工替换 rdpwrap.ini 的标准流程
确定是 ini 不匹配之后,替换顺序很关键。直接覆盖 ini 再重启服务,很多时候不生效,因为 dll 已经被加载进内存,读的是旧配置。
# 1. 先卸载旧包装器,清掉服务注册和 dll 加载配置 RDPWInst.exe -u # 2. 用新版 ini 覆盖安装目录里的文件(/Y 表示不询问直接覆盖) copy /Y C:\RDPWrap\rdpwrap.ini "C:\Program Files\RDP Wrapper\rdpwrap.ini" # 3. 重新安装,让服务重新读取 ini RDPWInst.exe -i # 4. 重启终端服务,让新的 dll 配置生效 net stop TermService net start TermService四步的顺序不能换。第 1 步的-u会把之前挂上去的加载配置清干净,如果跳过这步直接覆盖,旧的服务注册项还在,新 dll 有可能加载不上或者加载了旧版。第 2 步用copy /Y而不是直接拖拽,是因为拖拽到 Program Files 需要 UAC 提权,容易只复制了一半。第 3 步的-i会重新读 ini 并注册服务。第 4 步重启 TermService 会把你当前的远程会话断掉,所以别在自己正连着的机器上远程操作这一步,本地做或者留个后路。
重启完再开 RDPConf,Listener state 应该变成 Listening。如果还是 Not listening,回去核对 ini 里的节名和 dll 版本号,一个字符一个字符对,包括最后那个构建号。
4.3 用三个会话验证并发
状态显示 Listening 只是第一层,真正要验证的是并发。拿两台机器(或者一台机器开两个 mstsc 窗口)分别用不同账号连进来,看先连的会话会不会被踢。
# 在自己机器上查当前有哪些远程会话 query session /server:127.0.0.1 # 或者用 qwinsta,输出更简洁 qwinstaquery session的输出里,SESSIONNAME列出现rdp-tcp#0、rdp-tcp#1这种带编号的条目,说明多个 RDP 会话同时存在,STATE列是 Active 就代表在线。如果第二个账号登录时第一个被强制断开,说明并发补丁没生效,回到 4.1 检查 Wrapper state 和 ini 节。qwinsta是同一个功能的短命令,在部分精简系统上可能不存在,用query session更保险。
验证时注意用不同的本地账号,同一个账号在两个地方登录,系统本来就会踢掉前一个会话,这跟 RDPWrap 没关系,别误判成补丁失效。
5. 常见问题排查:更新后失效、Not listening、误报与登录异常
这一节记录的是我在不同机器上反复遇到的几类问题,每条按现象、原因、解决三段写。遇到问题时对号入座,比从头重装一遍快得多。
5.1 现象:系统更新重启后 Listener 变 Not listening
原因:Windows 月度更新替换了 termsrv.dll,版本号往前顶了一位,本地 rdpwrap.ini 里没有新版本的节,RDPWrap 找不到匹配项就不打补丁,3389 随之停止监听。这是最高频的一类,几乎每次大版本更新都会发生一次。
解决:按 2.1 节重新查 termsrv.dll 版本号,去 ini 里搜这个节名。搜不到就换新版 ini,然后按 4.2 节的四步走一遍。搜得到但状态仍不对,检查是不是覆盖到了错误的目录——RDPWrap 读的是C:\Program Files\RDP Wrapper\rdpwrap.ini,不是解压目录里那份,很多人改错文件。长期做法是把“更新后查版本号”写进自己的维护清单,别等连不上了才想起来。
5.2 现象:Wrapper state 显示 Not installed,重装也没用
原因:三个常见来源。一是没用管理员权限运行,RDPWInst 静默失败;二是杀软把 rdpwrap.dll 删了或隔离了,安装目录里少了文件;三是之前装过旧版本没卸干净,服务注册项冲突。
解决:先去看C:\Program Files\RDP Wrapper\目录里 rdpwrap.dll 在不在,不在就去杀软的隔离区恢复并加排除,然后重装。文件齐全的话,跑RDPWInst.exe -u卸载,删掉整个安装目录,再重新-i装一遍。判断权限问题最简单的办法是用管理员 PowerShell 跑一次,看窗口里有没有报错输出,比双击 bat 一闪而过强。
5.3 现象:install.bat 一闪而过,或者 RDPConf 双击没反应
原因:install.bat 闪退通常是路径里有空格或中文,批处理解析断了;RDPConf 没反应是 .NET Framework 4.x 缺失,多见于 Windows 7 或精简版镜像。
解决:把解压目录挪到C:\RDPWrap这种纯英文短路径下重试。RDPConf 打不开的先按 2.2 节查 .NET 版本,Release 值低于 528040 就补装 4.8。补完还打不开,在命令行里直接跑RDPConf.exe,让错误信息输出到控制台,比双击强。
5.4 现象:能连上但第二个用户一登录,第一个就被踢下线
原因:并发补丁没真正加载。Wrapper state 可能显示 Installed,但加载的是单用户模式的配置,或者 ini 节里的DefPolicyPatch那一项在当前版本上是 0。
解决:打开 ini 里对应版本的节,确认DefPolicyPatch.x64=1,为 0 就改成 1 后按 4.2 节重装。改完还是不行,说明这一节的偏移量本身不适用于你的 dll 版本,换一版 ini 再试。验证方式用 4.3 节的query session,别靠感觉判断。
5.5 现象:远程登录后黑屏,只有鼠标能动
原因:多数不是 RDPWrap 的问题,而是显卡驱动或会话初始化异常,尤其在虚拟机和带独显的笔记本上常见。RDPWrap 只改会话数量限制,不碰图形栈。
解决:先用本地登录确认机器本身正常,再换一个账号远程试,排除账号配置问题。都黑屏的话,在远程会话里用Ctrl+Alt+End调出安全选项尝试注销重登,或者临时在组策略里关掉“为远程会话使用硬件图形适配器”。这一条跟 RDPWrap 无关,但经常被误归到它头上。
6. 装完怎么验证真的跑通:三条命令加一次并发登录
状态窗口显示 Listening 只说明壳挂上了,不代表端到端可用。我一般用一套固定的四步验证,走完才算这台机器装好了。
第一步,确认 dll 版本和 ini 节名一致。命令在 2.1 节,把输出和 RDPConf 下面显示的版本号并排看一眼,不一致就是没对上。
第二步,确认服务在跑、端口在听。
# 服务状态应为 RUNNING sc query TermService # 3389 应处于 LISTENING,最后一列是占用进程 PID netstat -ano | findstr :3389sc query输出里的STATE是4 RUNNING才算正常,1 STOPPED就去服务管理器手动启。netstat那条如果什么都没输出,说明根本没监听,回到第 4 章;如果监听的是0.0.0.0:3389而不是127.0.0.1:3389,说明对外可达,防火墙规则也生效了。
第三步,从另一台机器发起连接,确认能进桌面而不是卡在“正在配置远程会话”。
第四步,用第二个账号再连一次,两边都保持在线,用query session看到两个rdp-tcp#条目同时是 Active,才算并发真的通了。
| 验证项 | 命令或动作 | 通过标准 |
|---|---|---|
| 版本匹配 | 查 termsrv.dll 版本,对比 RDPConf 显示值 | 完全一致 |
| 服务运行 | sc query TermService | STATE 为 RUNNING |
| 端口监听 | netstat -ano | findstr :3389 | 出现 LISTENING |
| 单会话连通 | 另一台机器 mstsc 连接 | 正常进入桌面 |
| 并发会话 | 两个账号分别登录后query session | 两条 rdp-tcp 均为 Active |
这套流程我在一台机器上至少走过十几遍,最大的感受是:真正花时间的从来不是安装那几十秒,而是装完之后不知道哪一步没对上,只能靠猜。从那以后我每次装完 RDPWrap,都会把 dll 版本号、ini 节名、RDPConf 三项状态截图存一份到自己的记录里,系统一更新先拿新版本号跟存档比一下,一分钟就知道要不要换 ini,比连不上了再回头查快太多。另外就是别把 ini 的更新当成一次性任务,把它当成跟系统补丁绑定的日常维护项,心里有数就不会慌。希望帮到你。
本文还有配套的精品资源,点击获取