SuperMap Web许可中心Windows开机自启配置完全指南
1. 为什么服务器重启后SuperMap Web许可中心经常“掉线”很多GIS运维同学应该都经历过这个场景周五下班前顺手给服务器打了补丁重启周一早上一来业务系统报警iServer 服务起不来一看日志提示“获取许可失败”“License not found”。第一反应是许可过期了登录 Web 许可中心一看许可明明还在有效期内但服务状态是“未运行”手动点一下启动业务立刻恢复。这个问题的根源就在于 SuperMap Web许可中心这个服务没有在 Windows 开机时自动拉起来。SuperMap 的许可体系里Web 许可中心本质上是一个独立运行的 Web 服务它负责给本机以及局域网内的其他 GIS 产品比如 iDesktop、iServer、iObjects提供许可授权。只要这台服务器重启过而这个服务没有自动启动下游所有依赖许可的 GIS 程序就全部“断供”。说白了许可中心相当于整个 GIS 体系的“供电局”电网没恢复你家灯再新也亮不了。所以解决“开机自启”这件事不是锦上添花而是生产环境稳定运行的底线。我见过不少项目部署文档里只写了“安装许可中心”压根没提自启配置。等到验收的时候才发现只要服务器一重启整套 GIS 系统就瘫了。所以这篇文章我把 Windows 环境下 SuperMap Web许可中心设置开机自启的几种方案、详细步骤、以及我踩过的坑全部整理出来供正在被这个问题折磨的同学参考。2. 先搞清楚许可中心到底是以什么形式运行的在动手配置之前你得先判断自己机器上的许可中心是什么形态。不同形态的安装方式自启配置的入口完全不一样。2.1 服务模式与控制台模式的区别SuperMap Web许可中心在 Windows 下有两种常见运行方式。一种是安装时注册成 Windows 服务比如服务名称通常包含 “SuperMap” 和 “License” 关键字这种情况下理论上可以通过 Windows 的“服务”管理单元设置自启动属性。另一种是以普通应用程序方式跑在用户会话里安装目录下有一个启动 exe需要手动双击或通过脚本拉起。区分方法很简单打开“服务”WinR 输入 services.msc找一下有没有名字里带 SuperMap、License、WebLicense 这类字样的服务项。如果有说明是服务模式如果没有那你大概率在“任务管理器 - 详细信息”里能看到一个独立进程对应安装目录下的某个 exe。服务模式按理说直接改启动类型就行但实际项目里我遇到最多的情况是服务是注册了但它依赖的某些组件启动时机太早或者服务账户权限不足导致开机时启动失败。这就引出另一个现象——你手动去服务里点“启动”没问题但开机自启就是失败。我后面会详细讲如何用任务计划程序绕开这个坑。2.2 找到许可中心的安装目录和日志位置不管你是哪种模式先确认安装目录。常见路径是C:\Program Files (x86)\Common Files\SuperMap\SuperMap License Center或者D:\SuperMap\LicenseCenter取决于你当时装的时候怎么选的盘符建议顺手看一眼安装目录下有没有logs文件夹里面会有许可中心自己的运行日志比如license-center.log。等我们配置完自启如果发现没成功第一件事就是翻这个日志比瞎猜高效得多。另外还要确认一下许可中心默认监听的端口。SuperMap Web许可中心通常用的是1947端口当然这只是约定俗成的默认值具体以你安装环境里的配置文件为准。后面验证服务是否起来直接访问http://localhost:1947如果页面能打开说明许可服务是活的。这个端口号在后续防火墙、代理配置中也会用到建议提前记下来。3. 方案选型服务启动、任务计划程序、启动文件夹怎么选明确了许可中心的运行形态之后接下来就是选方案。Windows 下做开机自启常见三条路服务管理器、启动文件夹、任务计划程序。我给个结论优先推荐任务计划程序尤其是在你搞不清楚服务为什么自启失败的情况下这是最稳的路线。3.1 各方案对比速览方案优点缺点适用场景服务启动类型设为“自动”最原生无额外脚本依赖关系复杂时容易启动失败权限查错麻烦服务注册正常、依赖简单的新装环境启动文件夹放快捷方式操作简单人人会配必须有人登录系统才触发服务器重启后没人登录就拉不起来个人开发机、临时测试环境任务计划程序触发时机可控可延迟启动、可指定账户、可写脚本增强健壮性配置项多初次上手有点绕生产服务器、需要稳定自启的场景生产环境我从来不用启动文件夹那一套因为 Windows 服务器重启后经常处于“未登录”状态启动文件夹只在用户登录桌面时才生效这就等于自启压根没发生。任务计划程序可以在“不管用户是否登录都要运行”的条件下执行适合无人值守的服务器。3.2 为什么我更推荐“延迟启动 脚本拉起”的组合任务计划程序里有个“延迟任务”的设置我强烈建议打开。原因在于服务器开机那会儿很多底层服务网络、数据库、域认证还没就绪许可中心如果抢跑可能因为拿不到某些资源而启动失败之后也不会自动重试结果就是还是起不来。我之前在一台配置较高的机器上踩过这个坑开机自启配好了结果还是偶发失败后来在系统事件日志里发现许可中心的进程在开机后一两秒内就启动了但此时网卡还没完全就绪导致它监听端口失败。加上延迟启动之后让系统先跑一会儿再拉起许可中心问题就消失了。另外用脚本拉起还有一个好处你可以把启动动作写成幂等操作先检测端口或进程如果已经起来了就跳过没起来再启动避免重复拉起导致多个实例打架。4. 实操配置通过任务计划程序实现开机自启完整流程下面进入正题我把生产环境中实际用的一套配置流程完整写出来。这套流程我已经在多个项目的 Windows Server 2016/2019/2022 上验证过稳定性很高。4.1 第一步准备启动脚本虽然任务计划程序可以直接启动 exe但我推荐先用 PowerShell 脚本包一层这样能在启动前做环境检查、写日志方便排查问题。打开记事本贴入以下内容$logFile C:\SuperMap\LicenseAutoStart.log $licenseExe C:\Program Files (x86)\Common Files\SuperMap\SuperMap License Center\bin\SuperMap.LicenseCenter.exe $port 1947 function Write-Log { param([string]$msg) $time Get-Date -Format yyyy-MM-dd HH:mm:ss Add-Content -Path $logFile -Value $time $msg } # 进程已存在则不重复启动 $proc Get-Process | Where-Object { $_.Path -eq $licenseExe } if ($proc) { Write-Log LicenseCenter already running, skip. exit 0 } # 端口已被占用则视为服务正常也不重复启动 $conn Get-NetTCPConnection -LocalPort $port -State Listen -ErrorAction SilentlyContinue if ($conn) { Write-Log Port $port already listening, skip. exit 0 } # 启动服务 try { Start-Process -FilePath $licenseExe -WorkingDirectory (Split-Path $licenseExe) Write-Log LicenseCenter start command executed. } catch { Write-Log Failed to start LicenseCenter: $_ exit 1 }注意$licenseExe的路径要替换成你那台机器上实际的 exe 路径。如果你不确定 exe 叫什么名字去安装目录下找常见的可执行文件长这样SuperMap.LicenseCenter.exe或bin目录下类似名字的程序。如果是服务模式脚本也可以改成用Start-Service来拉。把脚本保存为AutoStartLicense.ps1放到一个固定目录比如C:\Scripts\。建议不要放桌面也别放临时目录免得哪天被清理掉。4.2 第二步在任务计划程序里创建任务按 WinR输入taskschd.msc打开任务计划程序。右侧操作栏点击“创建任务”注意不是“创建基本任务”基本任务向导功能太少。在“常规”选项卡里名称填SuperMap License Center AutoStart方便以后识别。描述可填可不填建议写上 “Auto start SuperMap web license center after system boot”。不管你当前登录账号是管理员还是普通用户这里都勾选“不管用户是否登录都要运行”。勾选“使用最高权限运行”。在“配置”下拉框里选择Windows 10在 Server 2016/2019/2022 上同样适用。这些设置非常关键。勾选“不管用户是否登录都要运行”是保证无人值守时任务能执行的前提“最高权限”是因为许可中心写入日志、监听端口都需要一定权限。4.3 第三步设置触发器切到“触发器”选项卡点击“新建”然后“开始任务”选择启动时。勾选“延迟任务时间”并设置为30秒或1分钟我一般习惯 30 秒足够系统完成网络和基础服务初始化了。“启用”必须勾上。延迟时间的设置本质上是给系统开机过程留出缓冲。如果设置太短比如 5 秒可能系统都还没完全加载完设置太长比如 10 分钟业务恢复又太慢影响可用性。30 秒是我试过多次之后感觉比较均衡的值。4.4 第四步配置操作切到“操作”选项卡点“新建”操作选“启动程序”在“程序或脚本”里填powershell.exe在“添加参数”里填-ExecutionPolicy Bypass -WindowStyle Hidden -File C:\Scripts\AutoStartLicense.ps1这里有两个细节。-ExecutionPolicy Bypass是绕过 PowerShell 默认的执行策略限制很多机器默认是 Restricted直接双击脚本会被拦下来-WindowStyle Hidden是让脚本运行时不要弹出黑窗口毕竟这是服务器弹个窗口出来既不专业也容易被误关。4.5 第五步设置条件和设置“条件”选项卡里把“只有在计算机使用交流电源时才启动此任务”取消勾选服务器不存在省电问题但默认它是勾上的容易导致意外不触发。“设置”选项卡里勾选“如果任务失败按以下频率重新启动”频率可以设成每1分钟尝试次数3次这样就算第一次启动失败任务计划程序也会自动重试。到这里一个完整的自启任务就建好了。你可以先右键任务点“运行”测试一遍然后去任务管理器或者直接访问许可中心页面看看进程有没有起来。5. 实操配置服务模式下的自启检查和修复如果你发现自己的许可中心是服务模式那任务计划程序绕开服务依赖问题是一个可选方案但更好的做法是先把服务自身的启动类型调对再配合服务恢复选项来兜底。5.1 设置服务启动类型打开services.msc找到 SuperMap 相关服务比如名字里带 “SuperMap License Center” 或类似字样右键选择“属性”把“启动类型”改成“自动”。在“恢复”选项卡里把第一次失败、第二次失败都设为“重新启动服务”这样即使启动失败Windows 也会自动再拉一次。注意服务模式的启动依赖通常包括网络服务Network Profile、Windows Event Log 等这些一般都是先于应用服务启动的所以正常来说“自动”就够了。如果你的服务还依赖数据库或共享存储那才需要考虑延迟启动——服务属性里也有“自动延迟启动”选项原理跟任务计划程序的延迟一个意思。5.2 用命令验证服务的启动状态配置完之后可以用命令行快速验证一下服务当前的状态和启动方式sc qc SuperMap License Center sc query SuperMap License Centersc qc能看到服务的启动类型配置sc query能看到运行状态。如果启动类型不是AUTO_START说明你之前没改成功。有些情况下你可能装了多个 SuperMap 组件服务名很容易搞混建议用sc query | findstr /i supermap把所有 SuperMap 相关服务列出来再逐个确认哪个是许可中心。5.3 服务模式启动失败的排查如果你确认服务配置已经是“自动”重启后依然没有起来我建议去“事件查看器”里看两条线索Windows 日志 → 系统找 Service Control Manager 相关的错误记录里面会写失败原因常见的是“服务登录失败”或“依赖服务不存在”。许可中心自己的日志目录确认服务是否真的执行了启动逻辑但中途崩了。服务登录失败多半是“登录”选项卡里设置的账户密码过期或无权。改成LocalSystem账户通常能解决大部分问题缺点是权限较大但对于内网 GIS 服务器来说这是实际项目里很常见的取舍。6. 常见问题与排查技巧实录实操过程中可能你会遇到下面几个问题我按出现频率从高到低整理了一下。6.1 任务计划程序显示“上次运行结果 (0x1)”这是一个通用错误码表示脚本执行异常。先在命令行手动执行一遍脚本看报错信息powershell -ExecutionPolicy Bypass -File C:\Scripts\AutoStartLicense.ps1常见原因是脚本里的路径写错了或者 exe 没有找到。还有一种情况是脚本本身的执行策略没问题但 PowerShell 版本太老某些 cmdlet比如Get-NetTCPConnection在老版本里不存在。如果是 Server 2008 R2建议换用netstat -ano | findstr 1947来做端口探测。6.2 任务运行了但许可中心页面打不开先用端口探测工具确认进程到底监听没有。命令行执行netstat -ano | findstr 1947如果没有任何输出说明进程起来了但监听失败。最可能的原因是端口被其他程序占用换个端口或者停掉占用进程。也可能是因为许可中心启动时读取的配置文件里写了固定 IP而服务器开机瞬间 IP 还没获取到就会报错退出。这种情况在 DHCP 环境比较普遍解决办法是把服务器 IP 改成静态。6.3 开机能起来但 iServer 启动时报无法获取许可这个问题常见于 iServer 和许可中心不在同一台机器上的场景。iServer 启动时通过网络去请求许可中心但 iServer 启动得比许可中心早结果抢跑失败。先去 iServer 的配置文件里确认许可中心地址配对了没然后看 iServer 日志里的具体报错码。如果是网络超时那就是启动顺序问题。最简单的解决方案是在 iServer 启动脚本里加一个“等待许可中心端口可访问”的逻辑。可以写一个循环检测$port 1947 $deadline (Get-Date).AddMinutes(3) while ((Get-Date) -lt $deadline) { if (Get-NetTCPConnection -LocalPort $port -State Listen -ErrorAction SilentlyContinue) { break } Start-Sleep -Seconds 5 } Start-Process -FilePath C:\SuperMap\iServer\bin\startup.bat按我实际经验这个方案比单纯调任务延迟时间更靠谱因为它是根据实际端口状态来判断依赖是否就绪而不是靠估算一个时间。6.4 我整理的排查速查表现象可能原因排查方向服务未启动启动类型不是“自动”sc qc查看配置服务启动失败账户权限不足或密码过期改用 LocalSystem脚本任务返回 0x1脚本路径错误或命令不支持手动执行看报错进程在但页面打不开端口被占用或配置错误netstat 看监听下游产品获取许可失败启动顺序问题写端口等待逻辑6.5 给新同学的几点额外建议第一不要在生产环境直接改配置先在测试机上验证整个流程。第二所有的脚本、路径、端口号都记录到项目部署文档里别只放在自己脑子里。第三许可中心所在服务器的时间要和域控或 NTP 同步因为许可授权校验有时会检查系统时间和授权时间时间偏移会导致授权异常这玩意排查起来极其隐蔽。7. 最后分享一点个人使用习惯我在实际运维中比较推荐的组合是如果是新部署优先走“服务模式 启动类型自动 恢复选项重启服务”这是最干净纯粹的方式不需要额外脚本如果服务模式总是因为各种依赖问题起不来或者你根本没把握服务注册是否完整那就直接用“任务计划程序 PowerShell 探测脚本”几乎可以覆盖所有突发情况。还有一个细节容易忽略Windows 计划任务在系统刚启动时如果网络服务还没就绪任务可能直接触发但脚本里的网络相关检查会失败。所以脚本里尽量用进程检测和端口检测双保险不要只依赖端口检测因为极端情况下进程刚起来但端口还没开始监听。上面给的脚本模板已经写了这两层判断直接用就行。另外如果你同时装了 iDesktop 和 iServer它们对许可的请求方式不完全一样但许可中心只有一个。所以维护好这一台许可中心的可用性就等于维护了整套 GIS 环境的可用性。开机自启这个配置值得你花 10 分钟把它做扎实。