Winboat install.bat 逐行拆解:一个脚本如何装好两个 Windows 服务
2026/9/14 22:09:35 网站建设 项目流程

Winboat install.bat 逐行拆解:一个脚本如何装好两个 Windows 服务

【免费下载链接】winboatRun Windows apps on 🐧 Linux with ✨ seamless integration项目地址: https://gitcode.com/GitHub_Trending/wi/winboat

Winboat 让你在 Linux 桌面上直接运行 Windows 应用。但有个绕不开的问题:跑着跑着 Windows 虚拟机重启了,Linux 侧的窗口全掉线,手动进虚拟机点半天才能恢复。install.bat 就是为消灭这件事而生的:它在 Windows 端把后台服务、开机自启、端口放行一次性装好,之后每次开机,Linux 侧的应用都能自己连回来。

install.bat 执行顺序:双击后依次发生的 5 件事

先说清楚它在哪运行:这个脚本跑在 Windows 虚拟机里,素材来自C:\OEM目录(WinBoat 部署时把待装文件放进来的约定位置),整个流程全自动、不需要你点确认。按顺序看它干了什么。

第 1 步:导入一份"放宽远程桌面"的注册表配置 🗝️

接下来这一行做的事,是把一份 .reg 文件写进系统注册表:

reg import "%OEM_DIR%\RDPApps.reg"

RDPApps.reg 的内容拆开看就三件事:

  • 关闭 RemoteApp 白名单——默认 RDP 只允许白名单里的应用,关掉后 Winboat 才能远程拉起任意 Windows 程序
  • 允许未列入清单的程序——与上一条配套
  • 跟随服务器端键盘布局——避免远程会话弹出奇怪的键盘设置

不写这步,Linux 侧的应用菜单点了也没反应,RDP 根本拉不起程序。

第 2 步:建安装目录,先让 Windows Defender 闭嘴

建目录本身很简单,真正关键的是紧跟的一句 PowerShell:

powershell -ExecutionPolicy Bypass -Command "Add-MpPreference -ExclusionPath '%WB_DIR%'"

安装目录被加进 Defender 的排除列表。为什么?服务程序即将被高频读写,实时扫描会拖慢启动,甚至锁文件导致安装半途失败。先排除、再拷文件,顺序不能反。

第 3 步:把 OEM 目录整体拷进安装位置

xcopy "%OEM_DIR%\*" "%WB_DIR%\" /Y /E

/Y是覆盖时不再询问,/E是连空目录也一并复制。落地的是几样东西:server\(服务本体)、updater\(更新服务)、guest_token(Linux↔Windows 之间的身份凭证)、以及 nssm.exe——下一位主角。

第 4 步:用 NSSM 注册并启动两个系统服务 🛠️

这是整个脚本的心脏。NSSM 是一个能把普通 exe 伪装成系统服务的命令行工具——注册之后,这个 exe 就出现在"服务"管理器里,能被系统托管、崩溃自动拉起、开机自启。

"%NSSM%" install WinBoatGuestServer "%WB_DIR%\server\winboat_guest_server.exe" "%NSSM%" set WinBoatGuestServer Start SERVICE_AUTO_START "%NSSM%" set WinBoatGuestServer ObjectName "NT AUTHORITY\SYSTEM"
  • 第一行把 exe 注册为服务,从此它归 Windows 服务管理器管
  • SERVICE_AUTO_START=开机自动启动
  • NT AUTHORITY\SYSTEM= 以系统账户运行,用户没登录、屏幕锁着也能工作

第二个服务WinBoatGuestServerUpdater配一套同样的动作,负责后文会提到的更新。

第 5 步:放行两个端口,然后点火

netsh advfirewall firewall add rule name="Allow WinBoat API 7148" dir=in action=allow protocol=TCP localport=7148

两条 netsh 分别放行 TCP7148(API 端口)和7150(更新端口),然后nssm start把两个服务拉起来。脚本最后还挂了一个开机任务:

schtasks /create /tn "TimeSyncTask" /sc ONSTART ...

time-sync.bat 在每次开机时把虚拟机时钟与宿主机对齐——Windows 虚拟机重启后时钟漂移,不同步的话时间戳校验和日志都会乱套。

到这里,一条时间线走完了:调注册表 → 建目录并排除杀毒 → 拷文件 → 注册并启动服务 → 放行端口 → 挂开机任务。之后无论虚拟机怎么重启,Linux 侧都会自己连回来。

为什么非要把 exe 注册成 Windows 服务 🧠

普通 exe 双击运行,生命周期跟当前登录用户绑定:注销就没了,没人登录就不跑。而 WinBoat 的 guest server 要干的事恰恰相反——它必须在开机瞬间、无人登录时就监听 7148 端口等着 Linux 侧来连。服务形态天然满足:不依赖任何会话、由系统统一调度和看门。

用 NSSM 而不是自己写服务代码,是因为一个真正的服务要跟服务控制管理器(SCM)对话:应答暂停/停止、上报状态、崩溃后按策略重启。这些协议自己实现又是一门苦差事,NSSM 把 exe 包成"合规服务",一行 install 搞定。代价是目录里多一个 nssm.exe——它的完整性可以用 nssm.sha1.txt 里的f280858dcfefabc1a9a006a57f6b266a5d1fde8e校验,对不上说明文件被动过。

放行 7148 端口的逻辑:为什么非加不可 🔓

Windows 防火墙的入站策略默认是全禁,Linux 客户端连不进来,十有八九不是服务没起,而是端口被拦。所以 netsh 这条规则不是可选项:

  • 7148:对应 Linux 侧 constants.ts 中的GUEST_API_PORT,是应用列表、文件访问等所有 API 的入口
  • 7150GUEST_UPDATE_PORT,更新通道,专门给 updater 服务收包用

两条规则都限定了protocol=TCP,只开该开的那两个口,其余保持 Windows 默认收紧——放得开、也放得克制。

服务起不来 / 端口不通时怎么查

按"从 Windows 侧往 Linux 侧"的顺序排障,基本能覆盖所有情况:

  1. 先查服务在不在:在 Windows 里执行sc query WinBoatGuestServer。提示"服务不存在"说明 install.bat 没跑完,重新触发即可;STATE=RUNNING则继续下一步。
  2. 本地健康检查:在 Windows 里访问http://127.0.0.1:7148/health,updater 代码里自己探活用的就是这个地址,正常会返回{"status":"ok"}
  3. 本机通、Linux 不通 → 查防火墙netsh advfirewall firewall show rule name="Allow WinBoat API 7148",规则丢了就重跑第 5 步那条 netsh。
  4. 服务反复退出 → 看文件完整性:检查C:\Program Files\WinBoat\server目录是否齐全,缺文件就重跑 install.bat,/Y参数会直接覆盖旧文件。

哪些变量可以改 📝

  • WB_DIR(默认C:\Program Files\WinBoat):理论上可改,但服务路径、Defender 排除项全都引用它,改了等于推倒重装,不折腾最好不动。
  • OEM_DIR(固定C:\OEM):这是 WinBoat 部署流程的约定输入,别动。
  • 更新不用改脚本:日常升级走第二个服务——updater 监听 7150 接收 zip 包,停旧服务、替换文件、重启并健康检查,失败自动回滚。注意 updater 本体永不更新,它是更新链条的根,只能靠整个镜像重做。

一句话收尾

整条链路里 Linux 侧负责容器、RDP 会话和应用窗口,Windows 侧的全部工作浓缩在这 40 来行批处理里:常驻服务、开机自启、端口放行一次装齐。虚拟机重启后你的 Linux 桌面还能秒连 Windows 应用,功劳都在这条时间线上。

【免费下载链接】winboatRun Windows apps on 🐧 Linux with ✨ seamless integration项目地址: https://gitcode.com/GitHub_Trending/wi/winboat

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询