Windows Server 远程桌面开多用户:RDPWrap 配置全流程与踩坑记录【免费下载链接】rdpwrap.iniRDPWrap.ini for RDP Wrapper Library by Stas'M项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini凌晨两点,第三台 Windows Server 的远程桌面又连不进去了:前两个管理员的会话还挂着,新窗口弹回"连接数已达上限"。RDPWrap 本来能解除这种单会话限制、让多用户并发接入,但这台机器上组策略把 MaxUserSessions 刷新回了 1,补丁的强制值根本没接管。后来排查下来,问题出在配置文件没跟上系统的 build 号——这套工具能否生效,全靠本仓库里这一份份按版本对齐的 rdpwrap.ini 文件。🧩 为什么是 RDPWrap 而不是原生终端服务策略先说原生终端服务方案卡在哪。想在 Windows Server 上"正规"地开多用户远程桌面,得把 Terminal Services 那一整套配齐:RDSH 角色、CAL 许可服务器、对应数量的客户端访问许可。许可少一张,termsrv 就会把会话踢掉——策略写对了,门还是关的。我们只是想让两三个运维同时在线,不想为这个买单,原生路线在许可这一层就走不下去了;而组策略里那几项开关,改完还会被定时刷新的策略打回原形。RDPWrap 补的是另一层拼图:termsrv.dll 内部那个写死的判断。它通过 hook SLInit 相关调用,把 bServerSku、lMaxUserSessions 这些内存里的值强制成"服务器 SKU、会话数不限"的状态,整个过程不落盘、不改注册表,重启后服务再应用一遍。所以原生策略被刷回什么,对最终结果影响很小。与此同时它接管了策略读取这一层,[SLPolicy] 段就是工具回读策略时使用的替身值。部署后核对这几行是否就位:TerminalServices-RemoteConnectionManager-AllowMultipleSessions=1 TerminalServices-RemoteConnectionManager-MaxUserSessions=0 TerminalServices-RemoteConnectionManager-AllowAppServerMode=1这也是为什么注册表里看着是 1、实际却能进多个会话——真正被读走的不是那个值。📂 RDPWrap 配置文件怎么选:按系统版本来三个主流 Server 版本各有一条线,核对要点不一样。选文件的唯一依据是 systeminfo 里的 build 号,第四位也要逐位对。Windows Server 2016(10.0.14393):配置在主文件里先说个容易忽略的事实:autogenerated/ 目录里没有 14393 开头的文件。2016 这条线直接用顶层的 rdpwrap.ini,先找到 build 号对应的 [10.0.14393.xxx] 段。以 .5582 为例,需要核对的是:[10.0.14393.5582] SingleUserOffset.x64=25FA4 SingleUserCode.x64=Zero DefPolicyCode.x64=CDefPolicy_Query_eax_rcx这个版本同一段里 x86 和 x64 的偏移是两套(x86 的 SingleUserOffset 是 3A1E5),拿配置时先把架构后缀确认对——拿错架构比拿错版本更隐蔽,因为段标题看起来是对的。Windows Server 2019(10.0.17763)2019 是在用机器里最多的版本,配置取 autogenerated/ 下对应文件,例如 10.0.17763.5830-autogenerated_x64.ini。核心核对三行:[10.0.17763.5830] SingleUserOffset.x64=16F41 DefPolicyOffset.x64=20435 DefPolicyCode.x64=CDefPolicy_Query_eax_rcx原因很直接:偏移量随每次累积更新漂移,.5830 的文件不能硬套在 .7919 的系统上,build 第四位差一位,就该换另一份文件。Windows Server 2022(10.0.20348)RDPWrap 补丁段核对2022 线例如取 10.0.20348.1311-autogenerated_x64.ini:[10.0.20348.1311] SingleUserOffset.x64=08982 DefPolicyOffset.x64=1BA65 DefPolicyCode.x64=CDefPolicy_Query_eax_rcx这个版本比 2019 多一层要求:文件尾部还挂着一张 [10.0.20348.1311-SLInit] 偏移表(bInitialized.x64 等),因为 2022 改了 SLInit 结构体的地址布局。只核对主段、漏掉这张表,补丁会静默不生效,而且安装状态照样显示正常。完整文件列表见 autogenerated/,主配置文件是同级的 rdpwrap.ini。✅ RDPWrap 部署检查单:五步走完把上面几节的结论压成一条操作线,每次新机器照着走一遍:确认版本与架构:管理员终端跑systeminfo | findstr /B "OS Name" "OS Version",预期看到 "Windows Server 2022 Standard" 和 "10.0.20348.1311" 这样的两行,它们决定第 2 步选哪个文件。放入配置文件:把对应 .ini 拷到 RDPWrap 安装目录并命名为 rdpwrap.ini;预期文件里的段标题与第 1 步的 build 号逐位一致,2022 的还要带 SLInit 偏移表。安装并启动服务:执行RDPWrap.exe /install,再RDPWrap.exe /start;预期 services.msc 里 RDPWrap 状态为 Running,并在生成日志文件 \rdpwrap.txt。放行防火墙:执行netsh advfirewall firewall set rule group="remote desktop" new enable=Yes;预期 3389 入站放行。NLA 保持客户端与服务端两端一致,一边开一边关会在握手阶段直接失败。双会话验收:两个不同账号同时发起远程桌面;预期第二个会话进入时第一个不被挤掉。这一步过了,才算真正部署完成。🚧 上线后最容易翻车的三件事跑起来不等于跑得住,下面三个现场都真实发生过。组策略刷新后 MaxUserSessions 又被改回 1周一早上第二路会话突然进不来,注册表里 MaxUserSessions 又变回 1。先别急着再改策略:真正决定会话数的是 SLInit hook 强制的结构体值,策略里的 1 只是表象——出现这个症状,大概率是 RDPWrap 服务没在跑,打完更新之后尤其常见。查 services.msc 和 \rdpwrap.txt 最近几行,RDPWrap.exe /stop加/start重启服务,再用第 5 步的双会话验收一次。防再犯:把服务状态检查加进每日巡检,别拿策略值当健康指标。autogenerated 配置和系统 build 号差了一位某台机器打了月度更新后,RDPWrap 安装状态还是"成功",但新会话就是连不上,日志里能看到补丁没命中的记录。拿 systeminfo 的 build 号去对配置文件的段标题,会发现系统已经是 10.0.20348.1340,文件还停在 10.0.20348.1311。修复方式是整体替换:换一份最新的完整 rdpwrap.ini 或对应的 autogenerated 文件,而不是手工把单个 [10.0.x] 段拷进旧文件——较新的 build 依赖 [PatchCodes] 表里的新条目,段标题对了、补丁码没跟上,照样失败,Readme.md 顶部就专门警告过这一点。防再犯:每次打累积更新前,先确认新 build 已有对应配置,再安排安装。服务 Running 但 3389 还是不通服务状态是绿的,远程桌面却超时,这类问题基本不在补丁层。先在本机netstat -an | findstr 3389确认端口在监听,再查防火墙,跑一遍检查单第 4 步那条 netsh 命令。如果两端 NLA 配置不一致(客户端强制 NLA 而服务端证书或版本不支持),连接会在建立阶段直接失败,把两边 NLA 设置对齐即可。防再犯:每台新机器上线都完整走一遍检查单第 4、5 步,别假设"别的机器配过、这台也一样"。这个仓库大约每月更新一次新 build 支持,节奏可以看 Readme.md 里的 History。建议把 autogenerated/ 目录加进例行巡检清单:每次系统更新后,第一件事就是核对 build 号有没有对应的配置。【免费下载链接】rdpwrap.iniRDPWrap.ini for RDP Wrapper Library by Stas'M项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
Windows Server 远程桌面开多用户:RDPWrap 配置全流程与踩坑记录【免费下载链接】rdpwrap.iniRDPWrap.ini for RDP Wrapper Library by Stas'M项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini凌晨两点,第三台 Windows Server 的远程桌面又连不进去了:前两个管理员的会话还挂着,新窗口弹回"连接数已达上限"。RDPWrap 本来能解除这种单会话限制、让多用户并发接入,但这台机器上组策略把 MaxUserSessions 刷新回了 1,补丁的强制值根本没接管。后来排查下来,问题出在配置文件没跟上系统的 build 号——这套工具能否生效,全靠本仓库里这一份份按版本对齐的 rdpwrap.ini 文件。🧩 为什么是 RDPWrap 而不是原生终端服务策略先说原生终端服务方案卡在哪。想在 Windows Server 上"正规"地开多用户远程桌面,得把 Terminal Services 那一整套配齐:RDSH 角色、CAL 许可服务器、对应数量的客户端访问许可。许可少一张,termsrv 就会把会话踢掉——策略写对了,门还是关的。我们只是想让两三个运维同时在线,不想为这个买单,原生路线在许可这一层就走不下去了;而组策略里那几项开关,改完还会被定时刷新的策略打回原形。RDPWrap 补的是另一层拼图:termsrv.dll 内部那个写死的判断。它通过 hook SLInit 相关调用,把 bServerSku、lMaxUserSessions 这些内存里的值强制成"服务器 SKU、会话数不限"的状态,整个过程不落盘、不改注册表,重启后服务再应用一遍。所以原生策略被刷回什么,对最终结果影响很小。与此同时它接管了策略读取这一层,[SLPolicy] 段就是工具回读策略时使用的替身值。部署后核对这几行是否就位:TerminalServices-RemoteConnectionManager-AllowMultipleSessions=1 TerminalServices-RemoteConnectionManager-MaxUserSessions=0 TerminalServices-RemoteConnectionManager-AllowAppServerMode=1这也是为什么注册表里看着是 1、实际却能进多个会话——真正被读走的不是那个值。📂 RDPWrap 配置文件怎么选:按系统版本来三个主流 Server 版本各有一条线,核对要点不一样。选文件的唯一依据是 systeminfo 里的 build 号,第四位也要逐位对。Windows Server 2016(10.0.14393):配置在主文件里先说个容易忽略的事实:autogenerated/ 目录里没有 14393 开头的文件。2016 这条线直接用顶层的 rdpwrap.ini,先找到 build 号对应的 [10.0.14393.xxx] 段。以 .5582 为例,需要核对的是:[10.0.14393.5582] SingleUserOffset.x64=25FA4 SingleUserCode.x64=Zero DefPolicyCode.x64=CDefPolicy_Query_eax_rcx这个版本同一段里 x86 和 x64 的偏移是两套(x86 的 SingleUserOffset 是 3A1E5),拿配置时先把架构后缀确认对——拿错架构比拿错版本更隐蔽,因为段标题看起来是对的。Windows Server 2019(10.0.17763)2019 是在用机器里最多的版本,配置取 autogenerated/ 下对应文件,例如 10.0.17763.5830-autogenerated_x64.ini。核心核对三行:[10.0.17763.5830] SingleUserOffset.x64=16F41 DefPolicyOffset.x64=20435 DefPolicyCode.x64=CDefPolicy_Query_eax_rcx原因很直接:偏移量随每次累积更新漂移,.5830 的文件不能硬套在 .7919 的系统上,build 第四位差一位,就该换另一份文件。Windows Server 2022(10.0.20348)RDPWrap 补丁段核对2022 线例如取 10.0.20348.1311-autogenerated_x64.ini:[10.0.20348.1311] SingleUserOffset.x64=08982 DefPolicyOffset.x64=1BA65 DefPolicyCode.x64=CDefPolicy_Query_eax_rcx这个版本比 2019 多一层要求:文件尾部还挂着一张 [10.0.20348.1311-SLInit] 偏移表(bInitialized.x64 等),因为 2022 改了 SLInit 结构体的地址布局。只核对主段、漏掉这张表,补丁会静默不生效,而且安装状态照样显示正常。完整文件列表见 autogenerated/,主配置文件是同级的 rdpwrap.ini。✅ RDPWrap 部署检查单:五步走完把上面几节的结论压成一条操作线,每次新机器照着走一遍:确认版本与架构:管理员终端跑systeminfo | findstr /B "OS Name" "OS Version",预期看到 "Windows Server 2022 Standard" 和 "10.0.20348.1311" 这样的两行,它们决定第 2 步选哪个文件。放入配置文件:把对应 .ini 拷到 RDPWrap 安装目录并命名为 rdpwrap.ini;预期文件里的段标题与第 1 步的 build 号逐位一致,2022 的还要带 SLInit 偏移表。安装并启动服务:执行RDPWrap.exe /install,再RDPWrap.exe /start;预期 services.msc 里 RDPWrap 状态为 Running,并在生成日志文件 \rdpwrap.txt。放行防火墙:执行netsh advfirewall firewall set rule group="remote desktop" new enable=Yes;预期 3389 入站放行。NLA 保持客户端与服务端两端一致,一边开一边关会在握手阶段直接失败。双会话验收:两个不同账号同时发起远程桌面;预期第二个会话进入时第一个不被挤掉。这一步过了,才算真正部署完成。🚧 上线后最容易翻车的三件事跑起来不等于跑得住,下面三个现场都真实发生过。组策略刷新后 MaxUserSessions 又被改回 1周一早上第二路会话突然进不来,注册表里 MaxUserSessions 又变回 1。先别急着再改策略:真正决定会话数的是 SLInit hook 强制的结构体值,策略里的 1 只是表象——出现这个症状,大概率是 RDPWrap 服务没在跑,打完更新之后尤其常见。查 services.msc 和 \rdpwrap.txt 最近几行,RDPWrap.exe /stop加/start重启服务,再用第 5 步的双会话验收一次。防再犯:把服务状态检查加进每日巡检,别拿策略值当健康指标。autogenerated 配置和系统 build 号差了一位某台机器打了月度更新后,RDPWrap 安装状态还是"成功",但新会话就是连不上,日志里能看到补丁没命中的记录。拿 systeminfo 的 build 号去对配置文件的段标题,会发现系统已经是 10.0.20348.1340,文件还停在 10.0.20348.1311。修复方式是整体替换:换一份最新的完整 rdpwrap.ini 或对应的 autogenerated 文件,而不是手工把单个 [10.0.x] 段拷进旧文件——较新的 build 依赖 [PatchCodes] 表里的新条目,段标题对了、补丁码没跟上,照样失败,Readme.md 顶部就专门警告过这一点。防再犯:每次打累积更新前,先确认新 build 已有对应配置,再安排安装。服务 Running 但 3389 还是不通服务状态是绿的,远程桌面却超时,这类问题基本不在补丁层。先在本机netstat -an | findstr 3389确认端口在监听,再查防火墙,跑一遍检查单第 4 步那条 netsh 命令。如果两端 NLA 配置不一致(客户端强制 NLA 而服务端证书或版本不支持),连接会在建立阶段直接失败,把两边 NLA 设置对齐即可。防再犯:每台新机器上线都完整走一遍检查单第 4、5 步,别假设"别的机器配过、这台也一样"。这个仓库大约每月更新一次新 build 支持,节奏可以看 Readme.md 里的 History。建议把 autogenerated/ 目录加进例行巡检清单:每次系统更新后,第一件事就是核对 build 号有没有对应的配置。【免费下载链接】rdpwrap.iniRDPWrap.ini for RDP Wrapper Library by Stas'M项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考