解决Xshell 7卸载报错1628:深入Windows Installer脚本故障与修复

解决Xshell 7卸载报错1628:深入Windows Installer脚本故障与修复 1. 卸载Xshell 7时弹出1628错误先别急着骂微软问题出在脚本引擎前两天一个朋友跑来找我说他的Xshell 7突然连不上服务器了想卸载重装结果控制面板里点卸载进度条走了几秒就弹出个对话框——“1628完成基于脚本的安装失败”然后卸载程序直接回滚软件还留在原地。他以为是权限问题用管理员身份跑了一遍还是一模一样的报错。又去下载了Microsoft的卸载疑难解答工具跑了半天提示“无法卸载此程序”最后气得差点重装系统。这个场景我相信不少人遇到过。Xshell 7用的是InstallShield打包的卸载程序而1628这个错误码对应的其实是Windows Installer在执行安装脚本尤其是自定义动作Custom Action时脚本宿主解析或执行失败。说白了卸载程序不是删文件本身挂的而是它在执行一段“卸载前要跑的清理脚本”时Windows的脚本运行环境不给力整个安装事务就被回滚了。看到这儿你应该明白了这不是Xshell一个软件的问题很多用InstallShield打包的软件比如某些数据库客户端、网卡驱动工具、老款IDE在卸载时都可能碰见1628、1619、1622这一系列脚本相关报错。所以这篇我直接把卸载Xshell 7时我觉得最有效的处理路径拆开讲从错误码的底层原因到正常模式下的曲线卸载再到安全模式下的彻底清理一条龙给你捋清楚。2. 1628这个错误码到底在说什么卸载脚本的工作机制与失败根因想要彻底解决一个报错先得搞清楚这个错误码是在哪一环爆出来的。Windows Installer的卸载过程不是大家想象中那样“删除文件删注册表”两步走它其实是一个事务型操作整个流程可以理解为三大阶段收集卸载信息读取已安装产品的注册表条目确认产品代码ProductCode、安装目录、功能组件列表。执行卸载脚本InstallScript这是最关键的阶段卸载程序会按顺序执行一系列动作包括停止服务、删除驱动、清理注册表、运行定制的VBScript或JavaScript脚本。提交事务Commit只有当第二步所有动作都成功系统才会正式提交删除操作如果第二步中任何一个动作返回错误整个卸载就会被回滚文件、注册表、服务全部恢复原样。1628错误就是在第二阶段爆的。错误信息里有个关键词叫“基于脚本的安装script-based installation”意思是这个卸载包里带有自定义动作脚本。Xshell 7的安装包会在卸载时通过脚本去清理一些用户级配置比如会话文件、密钥缓存、配色方案或者尝试调用某些外部组件比如用于SSH密钥管理的服务。当脚本宿主Windows自带的不带UI的VBScript/JavaScript解释器因为某种原因无法启动、运行时被安全策略拦截、或者脚本文件本身在安装目录下被损坏系统就会抛出1628并中止卸载。我用个直白的比喻卸载程序就像搬家公司它已经打包好了所有文件收集信息阶段但出门前它要让房东签一个电子确认单执行脚本阶段。结果房东的手机坏了没法收验证码脚本宿主异常搬家公司只能把所有东西搬回原位告诉你“搬不了”。你觉得莫名其妙其实只是那台手机坏了而已。导致Xshell 7卸载时1628的具体常见原因我整理了一下基本上是下面这几类Windows Installer服务的状态异常服务本身没启动或者处于损坏状态。注意Win10/11上这个服务叫“Windows Installer”msiserver默认是手动触发但如果它卡死或配置被改过脚本就调不起来。InstallShield的脚本宿主组件注册信息丢失InstallShield需要调用系统自带的脚本宿主也就是msiexec在幕后要用的那个COM组件。如果系统里VBScript/JScript相关的DLL比如vbscript.dll、jscript.dll注册信息损坏脚本执行直接失败。卸载程序权限不足Xshell在安装时向Program Files写入文件还会在C:\ProgramData\NetSarang这类公共目录存放许可信息。卸载时如果无法写入日志文件或无法删除受保护目录脚本会返回一个非零错误码。安全软件拦截某些杀毒软件或安全策略会把卸载脚本当成可疑行为拦截脚本中途被掐断InstallShield就会认为脚本失败。安装缓存目录残留Xshell 7的安装包释放的临时文件在%TEMP%或C:\Windows\Installer里出现权限错乱导致脚本读取不到依赖文件。这里有个容易误解的点**很多人以为是Xshell程序本身损坏了其实不是。**Xshell的主程序文件就算完好无损卸载时脚本一样可能失败。因为脚本执行依赖的是系统级的COM环境和Windows Installer基础组件任何一个环节出问题都会让脚本挂掉。所以处理方向不是“修复Xshell”而是“修复它卸载时要跑的脚本环境”。3. 动手之前先做三件准备工作日志捕获、环境检查、备份数据3.1 开启Windows Installer详细日志拿到第一手报错现场在尝试任何修复手段之前我强烈建议你先记录一次完整的卸载日志。Windows Installer支持通过注册表开启详细日志记录这个日志会精确记录卸载到哪一步、调用哪个脚本、返回什么错误码比直接看那个1628的对话框有用得多。具体开启方法按WinR输入regedit定位到HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer在右侧新建一个DWORD (32位)值名字改为Logging双击把数值数据改成voicewarmupx这个字符串里每个字母都代表一类日志记录内容比如v是详细输出、o是磁盘空间不足提示、i是进程信息全开就是了确定后重启一下Windows Installer服务或者直接重启系统生效。之后重新触发一次卸载无论报不报错系统都会在C:\Windows\Temp目录下生成一个Msi*.log文件文件名类似Msi1d2b3.log。用记事本打开直接搜Return value 3或者1628就能看到出问题时具体是哪个Custom Action在执行。3.2 排查Windows Installer服务和脚本宿主基础组件状态日志打开之后顺手把基础环境状态检查一遍这一步很快但很有用。先看服务状态。按WinR输入services.msc找到Windows Installer服务确认它的启动类型是“手动”并且服务状态不是“已停止”的灰色不可操作状态。如果服务没有启动右键选择“启动”。如果启动时报错说明msiserver本身的依赖项有问题这时候可以打开管理员命令行执行msiexec /unregister msiexec /register这两条命令会把Windows Installer的COM注册信息重新写一遍相当于“重装”一次安装引擎的壳。执行完再查看服务是否能正常启动。再看脚本宿主。管理员命令行里执行regsvr32 vbscript.dll regsvr32 jscript.dll regsvr32 scrrun.dllscrrun.dll是微软脚本运行时Microsoft Scripting Runtime的核心组件很多安装脚本都依赖它做文件操作。这三条命令执行时可能会弹出“已成功”的提示框全部注册成功后再试一次卸载。3.3 备份Xshell的会话、密钥和配色配置这个步骤很多人忽略但我觉得排错优先原则里数据安全必须排在第一。Xshell 7的配置默认存在用户目录下的隐藏文件夹具体路径是C:\Users\你的用户名\Documents\NetSarang Computer\7这里存放了会话文件.xsh、密钥ssh_host_rsa_key这类、以及全局配置。卸载重装时如果你把这些配置清了重新连接所有服务器都得重新配一遍非常折腾。所以不管后面会不会走到“彻底清理残留”那一步先把整个NetSarang Computer文件夹复制一份到桌面或移动硬盘安心做后续操作。4. 常规修复三板斧重装卸载引擎、清理安装缓存、以兼容模式执行卸载4.1 “先修复引擎再卸载”的逆向思路很多人遇到卸载失败第一反应是找卸载工具强删。但我的经验是Xshell这种商业软件卸载失败先用最轻量的方式恢复Windows Installer引擎的可用性反而比强删更省事。上面提到的msiexec /unregister和msiexec /register执行完之后先别急着卸载Xshell再从Xshell官网下载最新的Xshell 7安装包随便哪个版本安装包自带修复选项。双击安装包选择**“修复”Repair**选项。这一步的目的是让InstallShield重新执行一次安装脚本把卸载脚本依赖的文件、注册表项和配置全部重新写一遍。修复完成后再从控制面板卸载大概率就不会报1628了。这里解释一下为什么“修复”能解决“卸载”的失败InstallShield的卸载脚本在安装时会被解压到C:\Windows\Installer下的缓存文件里如果这个缓存损坏或缺失卸载时脚本根本无法拿到“脚本定义文件”一执行就挂。修复动作会重新生成缓存文件等于把卸载脚本重新部署了一遍。如果官网上找不到对应版本的安装包也可以直接在控制面板的程序列表里选Xshell点“更改”有的版本会直接调出修复界面。实在没入口就用Windows Installer CleanUp Utility但那个工具比较老在Win10/11上兼容性一般我更推荐用命令行方式msiexec /f {产品代码} /qb产品代码可以从注册表的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall下找Xshell对应的ProductCode项或者用日志文件里的Product Code字段在管理员命令行下执行上述命令强制修复安装。4.2 SetUp.exe的兼容模式和“以管理员身份运行”陷阱Xshell 7安装包的卸载程序在控制面板 - 卸载程序 - Xshell 7 - 卸载这个入口调用的而它在C:\Program Files\NetSarang\Xshell 7目录下还会放一个uninstall.exe或Setup.exe。我实测过从控制面板触发失败时有时候直接去安装目录双击卸载程序反而能成功。原因是Windows Installer的控制面板入口会带上一个完整的产品上下文ProductContext而直接运行安装目录下的卸载程序则走的是另一个执行路径。当然这里有个前提如果你是从安装目录跑卸载程序不要右键设置“以兼容模式运行Windows 7/XP”。脚本引擎报错的时候兼容模式反而会引入不属于当前系统的DLL映射逻辑让脚本更跑不动。就用普通管理员身份运行就好。如果双击目录下的卸载程序依然报1628可以试试把安装目录临时改名。比如把C:\Program Files\NetSarang\Xshell 7重命名为Xshell 7_old然后再运行卸载程序。这种做法有点野路子但原理是让卸载脚本在找不到原始文件时进入“容错清理模式”在某些案例里确实能绕过脚本检查文件哈希失败的问题。4.3 用InstallShield的静默卸载参数绕过UI脚本这套方法算是实战中成功率很高的一个手段。Xshell 7的卸载程序支持静默卸载参数在管理员命令行里进入安装目录执行Setup.exe /uninstall /quiet /noreboot或者更直接的msiexec方式msiexec /x {产品代码} /qn静默模式的优势是不走卸载向导的交互UI。很多1628报错其实是在UI渲染阶段或交互逻辑阶段挂掉的绕开UI后卸载引擎直接执行核心脚本反而不会被前端问题卡住。我遇到过好几台机子退出界面报错但静默卸载完全正常一条命令跑完软件干干净净被卸载。如果静默卸载也报错记下日志里对应的Custom Action名然后在管理员命令行里手动执行那个脚本尝试复现能帮你看清到底是脚本本身有兼容性问题还是它依赖的外部组件缺失。5. 当1628变成顽固症安全模式下清理残留文件与注册表5.1 为什么“正常模式卸不动”而“安全模式通常能成功”如果上面三板斧全试了还是卡在1628那就要考虑“正常模式下的某个环境因素一直在干扰脚本执行”的可能性。这时我倾向于直接进安全模式做卸载。安全模式一个很大的特点**它只加载运行Windows内核和一些基础驱动、核心系统服务不加载第三方应用程序、不加载很多系统服务的完整版本。**也就是说杀毒软件不会后台拦截脚本、Windows Installer依赖的某些被占用的DLL文件也释放了句柄、权限校验逻辑更宽松。很多在正常模式下“脚本无法创建临时文件”“脚本无法删除正在被使用的文件”的问题在安全模式下天然消失。进入安全模式的方法不再赘述WinR输入msconfig引导页勾选“安全引导”重启或者按住Shift点重启进入高级启动选项。注意选“安全模式”而不是“带网络的安全模式”因为网络相关服务在这个场景下没必要加载加载越少干扰越少。5.2 安全模式下卸载的三步顺序服务清理、驱动清理、主程序清理进安全模式以后按以下顺序操作第一步先停掉和Xshell相关的后台服务。打开任务管理器切到“服务”选项卡查看是否有NetSarang相关服务在运行有的话右键停止。第二步使用系统自带的pkgmgr或者dism命令做一次系统组件清理这一步不是必须的但能帮Windows Installer重新评估已安装的产品状态。管理员命令行执行dism /online /cleanup-image /startcomponentcleanup这个命令会清理系统组件存储中以损坏或丢失状态的临时文件运行时间可能比较长取决于系统盘文件量但执行完后再去卸载脚本读取依赖文件的成功率会提高不少。第三步尝试静默卸载。如果控制面板里已经看不到Xshell或者卸载入口失效使用命令行msiexec /x {产品代码} /qn同样的产品代码从注册表或日志里获取。如果这一步返回成功说明1628的坑在安全模式下被绕过去了。如果还是失败就考虑备份数据之后走“半手动卸载”路线也就是我第6节要专门讲的残留清理。5.3 注册表清理的几个权限坑与精确路径很多教程会说“卸载失败就删注册表”但注册表真不是靠删HKEY_CLASSES_ROOT下所有含Xshell关键字的项就能解决的。Xshell 7的注册表残留主要分布在三处而且每一处的清理权限不一样第一处卸载信息控制面板入口就是读这里HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall在子项里找包含Xshell或NetSarang的项右键删除。这里一般不存在权限问题普通管理员就能删掉。第二处安装路径和组件信息HKEY_LOCAL_MACHINE\SOFTWARE\NetSarang如果存在就删掉整个NetSarang键。注意如果你还装了Xftp或者Xmanager删的时候要谨慎确认子项里只有Xshell相关内容再动手。第三处用户级配置HKEY_CURRENT_USER\Software\NetSarang这个键在管理员权限下反而不一定能删干净因为注册表编辑器是当前用户启动的。最稳妥的办法是确认当前账号和会话配置对应的账号一致后再把注册表编辑器以管理员身份运行一次删掉HKEY_USERS\.DEFAULT\Software\NetSarang和对应SID下的Software\NetSarang。删除注册表项时如果提示“无法删除”大概率是权限问题或该项被某个进程占用。前者用regedit的“权限”功能给Administrators组添加“完全控制”后者重启后再删。我有一个习惯删完注册表后导出一份.reg备份万一卸载重装后某个配置找不回来还能导回去对比。5.4 文件级残留清理安装目录、公共数据目录、用户配置目录注册表清理完文件级残留也得扫一遍。Xshell 7的主要目录有这几个安装目录C:\Program Files\NetSarang\Xshell 7用户会话配置目录C:\Users\你的用户名\Documents\NetSarang Computer\7公共用户数据C:\ProgramData\NetSarang开始菜单快捷方式C:\ProgramData\Microsoft\Windows\Start Menu\Programs\NetSarang这四个目录里ProgramData下的目录有时候会有权限陷阱。删除时提示需要“TrustedInstaller”权限的话用标准管理员是删不掉的需要在目录的属性 - 安全 - 高级里把所有者改成Administrators再给自己添加完全控制权限。如果懒得去改可以用一个简单粗暴的命令行takeown /f C:\ProgramData\NetSarang /r /d y icacls C:\ProgramData\NetSarang /grant administrators:F /t这两条命令的意思是接管该目录的所有权takeown然后给管理员组赋予完全控制权限icacls。执行完就能删除。用户配置文件目录Documents\NetSarang Computer是主要存储会话和密钥的地方如果之前已经备份过这里可以直接删。如果还想保留配置给重装后的新版本用就先别删等重装后把备份放回去就行。6. 卸载完不等于干净驱动残留和网络组件检查有两次我在安全模式下成功卸载了Xshell但重装新版本后发现一个诡异现象新装的Xshell 7打开就闪退或者SSH连接建立后立刻断开。排查来排查去发现是残留的老版本WinPcap或Npcap驱动在作怪。Xshell 7为了支持一些网络抓包和隧道功能安装时会附带或依赖网络抓包驱动常见的是Npcap或老版本的WinPcap。卸载脚本执行失败时主程序被删了但这个驱动服务往往没有跟着卸载干净服务还在后台运行设备和端口处于占用状态。新版本一启动去探测这个驱动要么重复注册冲突要么版本不匹配直接闪退。检查方式管理员命令行执行sc query npcap和sc query winpcap如果返回SERVICE_NAME显示还有这两个服务就手动删除sc stop npcap sc delete npcap sc stop winpcap sc delete winpcap同时在设备管理器里查看“网络适配器”下是否有“Npcap Loopback Adapter”或“WinPcap”相关的虚拟网卡有的话右键卸载设备勾选“删除此设备的驱动程序软件”。这个步骤很多人会漏掉但它确实是Xshell类软件卸载失败后“重装还是有问题”的一个高频元凶。如果你卸载Xshell后短期不打算重装这个检查可以放到最后做如果马上要装新版一定先清干净再装。另一个网络层面的残留是主机的SSH Host Key缓存。Xshell在首次连接某台服务器时会把服务器返回的主机指纹存到注册表里。卸载时脚本要清理这个注册表项如果脚本挂了这个缓存就留在注册表里。重装新版本后再连接同一台服务器Xshell会提示“主机密钥已更改”之类的警告虽不影响连接但看着吓人。清理方法是在注册表里搜索Host Key相关项或者直接删掉第5.3节里提到的HKEY_CURRENT_USER\Software\NetSarang下的整个键一了百了。7. 最省心的兜底方案官方卸载工具与Windows自带的程序卸载疑难解答如果安全模式也试过了残留也手动清理了一部分但系统里某些和Xshell关联的组件比如共享DLL、公共运行库还是删不干净那我建议直接用两个官方和半官方的工具收尾。第一个是NetSarang官方提供的卸载工具在官网Support下载区可以找到有时候叫RemoveTool或Uninstall Helper。这个工具会扫描计算机上所有NetSarang产品相关的注册表、文件、驱动和服务条目一键生成清理列表并执行删除。说实话这个工具对于正常卸载失败但系统环境还比较干净的情况很有效但如果注册表里已经被你手动改得七零八落它可能反而找不到入口。所以我的建议是手动清理和官方工具不要混着用要么全用工具要么就手动一步步来。第二个是我在开头提到的微软官方的MicrosoftProgram_Install_and_Uninstall.meta.diagcab程序安装卸载疑难解答。这个工具能自动检测“已安装程序列表与注册表卸载项不一致”“安装缓存目录权限异常”“Windows Installer服务状态异常”等问题并且在检测到问题后自动修复。它虽然对1628这种脚本错误不是100%有效但在修复“安装缓存目录权限异常”这块很有一手。有些时候1628报错就是因为C:\Windows\Installer目录里的缓存文件权限被改了用一个低权限用户卸载就失败用管理员身份卸载就正常——这个工具会自动把这个权限修正过来。如果你实在不想折腾还有一个最暴力的做法**新建一个Windows管理员账户注销当前账户用新账户去卸载Xshell。**这个方法我帮人处理过至少三次每次都成功。因为新账户的文件、注册表、权限上下文是完全干净的不会继承旧账户下被各种软件改得面目全非的脚本宿主、共享DLL或COM组件注册表状态。卸载成功后如果不需要这个新账户再切换到原账户把它删掉就行。8. 踩过几次坑之后我的一些心得体会写到最后分享几个我踩过坑之后沉淀下来的操作习惯不一定都写在官方文档里但对以后处理类似问题很有用。第一**在处理任何“安装/卸载失败”问题前先开MSI详细日志。**不要凭感觉去改注册表、跑清理工具先让系统把现场记录下来。日志文件路径固定搜索关键字又快又准比自己瞎猜省力十倍。第二**“用管理员身份运行”不是万能的但“先用普通方式卸载一次再考虑管理员方式”是个很好的排查顺序。**因为有些安装脚本会在普通权限下做一些用户级清理管理员模式下反而会跳过这些动作导致卸载不彻底。比如Xshell的全局配色和会话搜索索引普通权限卸载时会删管理员模式卸载时如果用户上下文不同可能就留在原处了。第三**别把第三方卸载工具当首选。**尤其是各种“强力卸载”“注册表清理”类工具它们在扫描删除时通常会连带删掉一些不属于目标软件的注册表项。Xshell和Xftp共用一部分NetSarang的注册表公共项用工具暴力清理后Xftp可能下一次启动就找不到许可证。我用官方卸载工具或者msiexec命令行从来没把“邻居软件”误伤过。第四**重装Xshell前先把所有旧版本的安装缓存清理干净。**尤其是C:\Program Files\NetSarang这个目录如果卸载脚本没有成功运行会留下一个只有部分文件的空壳目录。新版安装包检测到这个目录存在且版本标识对不上就可能提示“检测到更新版本”或者直接拒绝安装。处理方式简单安装前手动删除整个NetSarang目录即可。第五**如果一台机器上同时装了Xshell和Xftp卸载Xshell时务必把Xftp的卸载脚本也一起检查一遍。**这俩共用InstallShield的部分脚本组件Xshell的卸载脚本运行异常往往意味着Xftp将来卸载时大概率会复刻同样的错误。趁环境变量和脚本宿主状态还热乎把两个软件一起处理干净比隔三差五被类似问题折磨要舒服得多。Xshell 7的1628报错本质上就是Windows Installer脚本环境的一颗定时炸弹。只要你摸清了脚本执行依赖什么、什么条件会导致它失败排查起来其实不复杂。希望这篇能帮你在遇到类似问题时少走点弯路一次卸载干净。