Linux 运行 Windows 应用,靠一条 40 多行的脚本完成 Windows 服务自动化部署
2026/9/6 17:24:21 网站建设 项目流程

Linux 运行 Windows 应用,靠一条 40 多行的脚本完成 Windows 服务自动化部署

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

Winboat 让你在 Linux 桌面里像打开原生窗口一样运行 Windows 应用;Windows 侧的全部组件由一条 40 多行的批处理脚本装好。这篇文章拆解开自动化部署的四步流程,以及 nssm 注册服务的几个关键配置。

场景切入:手动装这套东西有多麻烦

假设你刚重装了一台 Windows 来宾系统,想让 Winboat 的 Linux 端连上它:

  • 要装WinBoatGuestServerWinBoatGuestServerUpdater两个服务,每个都要单独指定工作目录、启动方式和运行账户
  • 手工敲sc命令配服务,少敲一个参数就不启动,而且错误提示基本等于没有
  • Windows 默认防火墙拦截所有入站连接,7148 端口不通,Linux 侧等到的只有超时
  • 换个机器、或者重装系统,上面全部重来一遍

这些活没有一处值得靠脑子记。Winboat 把它们全部写进了 install.bat。

Windows 服务一键部署:脚本按顺序做了四件事

第一步:统一路径,先把目录移出杀毒扫描

脚本开头把所有路径收敛成变量,比如安装目录固定为C:\Program Files\WinBoat。建好目录后,它顺手把这个路径加进 Windows Defender 的排除列表——因为接下来要写入大量来宾二进制文件,实时扫描一边扫一边写,既拖慢速度,还可能误报卡住安装。

第二步:xcopy 一次性搬完全部依赖

运行所需文件预先放在C:\OEM里。一条命令xcopy "%OEM_DIR%\*" "%WB_DIR%\" /Y /E把它们连同 server\、updater\ 这些子目录整体复制到安装目录,/Y保证重复运行时不弹确认框,全程无人值守。

第三步:用 nssm 注册两个 Windows 服务

这是整个脚本的核心。nssm 能把普通 exe 包装成标准 Windows 服务,服务机制自带依赖配置、崩溃自动拉起和开机自启,这些是任务计划做不到的。Winboat 注册了两个服务:

  • WinBoatGuestServer:API 服务,监听 7148 端口
  • WinBoatGuestServerUpdater:自更新服务,监听 7150 端口

每个服务依次设置自动启动(SERVICE_AUTO_START)、工作目录(AppDirectory)、描述和运行账户,四步之内全部就位。

第四步:放行端口、启动并挂上开机任务

两条netsh命令分别放行 TCP 7148 和 7150,随后nssm start直接拉起两个服务。最后schtasks创建 TimeSyncTask,开机时以 SYSTEM 身份执行 time-sync.bat,保持两侧时钟同步。

关键配置拆解:三个"为什么"值得停下看

为什么用 xcopy /E 而不是 copy

copy只处理当前层级的散文件,子目录会整个丢。来宾服务依赖 server\ 和 updater\ 两套子目录结构,/E是必须的,下面这行就是全部依赖部署动作:

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

复制完成、覆盖静默,装完就能跑。

为什么运行账户选 NT AUTHORITY\SYSTEM

普通用户账户有两个坑:密码一改或者账户被禁用,服务立刻启动失败;权限也常不足以访问系统资源。SYSTEM 是内置账户,不随任何用户密码变化,权限足够,适合需要长期静默运行的场景:

nssm set WinBoatGuestServer ObjectName "NT AUTHORITY\SYSTEM"

为什么防火墙只放行两个端口

不显式放行,Linux 侧永远连不上 Windows 侧。但放行也不是越宽越好——Winboat 只开了它实际在用的 7148 和 7150 两条规则,其余端口维持 Windows 默认拦截状态,这是最小权限原则最省事的落法。

📋 故障自查清单:三类常见现象怎么查

现象先跑什么往哪查
nssm 安装服务失败对比 guest_server/nssm.sha1.txt 里的校验值和本地 nssm.exe 哈希;再执行nssm.exe version可执行文件损坏或被替换
Linux 端一直连不上netstat -ano \| findstr 7148看端口被谁占着端口被别的程序占用,或防火墙规则没生效
服务装上了但无响应nssm status WinBoatGuestServer;再看winboat_guest_server.log工作目录指错位置、依赖文件缺失

如果你是自己改过端口,记得同步 src/renderer/lib/constants.ts 里的GUEST_API_PORT、防火墙规则和服务描述,三处不一致时排查成本翻倍。

🔧 进阶定制:两个实用小改动

改安装路径要同步三处:install.bat 里的WB_DIR变量、nssm 的AppDirectory、防火墙规则里的可执行文件路径。只改第一处,服务能启动但找不到文件,报错很难看。

日志集中管理:企业环境可以单独定义LOG_DIR,再用nssm set WinBoatGuestServer AppStdout "%LOG_DIR%\stdout.log"把服务输出重定向到文件,方便接集中监控。

Go 写的来宾端源码都在 guest_server/ 目录里,updater 带健康检查和自动回滚逻辑,值得顺带一读。

这条 40 多行的脚本给所有需要在 Windows 侧静默部署服务的场景提供了一个通用范式:路径收敛为变量、标准工具批量复制、nssm 统一注册服务、端口按需放行。下次做类似集成时,这套思路可以直接搬走。

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

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

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

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

立即咨询