拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Windows 莫名安装 TabFlow 且无法正常卸载:完整排查、强制清理与 C/D 盘无法打开修复指南

一、问题背景最近遇到了一个比较麻烦的问题Windows 电脑里莫名其妙出现了一个名为TabFlow的程序。在“设置 → 应用 → 已安装的应用”中能够看到 TabFlow但正常卸载时 Windows 提示Windows 无法访问指定的设备、路径或文件。你可能没有适当的权限访问该项目。找到它的安装目录C:\Program Files (x86)\TabFlow里面确实存在uninst.exe但手动运行uninst.exe仍然出现相同错误。使用winget uninstall TabFlow也无法解决。最终排查发现这个 TabFlow 并不是简单地放了几个 EXE 文件而是至少涉及主程序TabFlow64.exe托盘程序TabFlowTray.exeAloneTrayServer.exeTabFlowSearch.exeWindows 服务TabFlowSvc计划任务TabFlowTrayWindows Folder Shell 修改软件卸载注册表项因此如果只是删除主程序或者尝试运行uninst.exe并不能完整解决问题。本文记录一次完整的排查和清理过程。二、第一步确认 TabFlow 的实际安装位置首先以管理员身份运行 PowerShell。查询 Windows 中注册的 TabFlow 卸载信息Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*, HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* -ErrorAction SilentlyContinue | Where-Object {$_.DisplayName -match TabFlow} | Select-Object DisplayName, Publisher, InstallLocation, UninstallString本机得到DisplayName : TabFlow InstallLocation : C:\Program Files (x86)\TabFlow UninstallString : C:\Program Files (x86)\TabFlow\uninst.exe所以可以确认安装目录为C:\Program Files (x86)\TabFlow三、为什么 winget 也卸载失败这里有一个容易误解的地方。执行winget uninstall TabFlow并不意味着 winget 一定拥有另一套“强制删除”机制。对于这类已经通过 Windows 注册卸载程序的软件winget 最终仍可能需要调用软件注册的卸载机制。而 TabFlow 注册的卸载程序正是C:\Program Files (x86)\TabFlow\uninst.exe所以如果uninst.exe本身无法正常执行winget 同样可能失败。这时继续反复运行卸载器意义不大需要开始检查它的后台驻留机制。四、检查 TabFlow 是否仍在后台运行管理员 PowerShell$dir C:\Program Files (x86)\TabFlow Get-CimInstance Win32_Process | Where-Object { $_.ExecutablePath -and $_.ExecutablePath.StartsWith( $dir, [System.StringComparison]::OrdinalIgnoreCase ) } | Select-Object ProcessId, Name, ExecutablePath, CommandLine实际排查时发现了TabFlow64.exe结束之后后续又发现过AloneTrayServer.exe TabFlowTray.exe TabFlowSearch.exe可以统一结束所有从 TabFlow 安装目录启动的进程$dir C:\Program Files (x86)\TabFlow Get-CimInstance Win32_Process | Where-Object { $_.ExecutablePath -like $dir\* } | ForEach-Object { Write-Host 正在结束: $_.Name PID: $_.ProcessId Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue }然后重新查询确认没有相关进程。五、关键问题TabFlow 安装了 Windows 服务一开始直接查询服务时并不顺利因此后来直接检查 Windows 服务对应的注册表。执行Get-ChildItem HKLM:\SYSTEM\CurrentControlSet\Services -ErrorAction SilentlyContinue | ForEach-Object { $svc Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue $params Get-ItemProperty $($_.PSPath)\Parameters -ErrorAction SilentlyContinue if ( $($svc.ImagePath) -like *TabFlow* -or $($params.ServiceDll) -like *TabFlow* ) { [PSCustomObject]{ ServiceName $_.PSChildName ImagePath $svc.ImagePath ServiceDll $params.ServiceDll Start $svc.Start } } }最终发现ServiceName : TabFlowSvc ImagePath : C:\WINDOWS\System32\svchost.exe -k netsvcs ServiceDll : C:\Program Files (x86)\TabFlow\lpi\TabFlowSvc.dll Start : 2这里就找到了一个非常关键的驻留组件TabFlowSvc其中Start 2表示这是自动启动服务。而且它不是简单运行TabFlowSvc.exe而是通过svchost.exe加载C:\Program Files (x86)\TabFlow\lpi\TabFlowSvc.dll这也解释了为什么直接删除 TabFlow 文件夹时TabFlowSvc.dll等文件可能出现“拒绝访问”。六、停止、禁用并删除 TabFlowSvc管理员 PowerShellsc.exe stop TabFlowSvc然后sc.exe config TabFlowSvc start disabled确认状态sc.exe query TabFlowSvc正常应看到STATE : 1 STOPPED然后删除服务sc.exe delete TabFlowSvc再次查询sc.exe query TabFlowSvc如果出现OpenService 失败 1060: 指定的服务未安装。这里的1060反而是我们希望看到的结果说明该服务已经不存在。七、为什么直接 Remove-Item 会“拒绝访问”结束相关进程、处理服务之后我尝试Remove-Item C:\Program Files (x86)\TabFlow -Recurse -Force但部分文件仍然提示对路径的访问被拒绝典型包括lpi\svc.dat lpi\TabFlowSvc.dll plugin\Basic.tpi plugin\BwSystemHelper.tpi这里不能把-Force理解成“无视 NTFS 权限强制删除”。如果当前管理员账户没有这些文件的所有权/删除权限Remove-Item -Force仍然可能失败。所以需要先接管目录所有权并重新设置 ACL。八、取得 TabFlow 文件夹所有权管理员 PowerShelltakeown /f C:\Program Files (x86)\TabFlow /a /r /d y然后重置 ACLicacls C:\Program Files (x86)\TabFlow /reset /t /c /q再明确给予本机 Administrators 组完全控制权限icacls C:\Program Files (x86)\TabFlow /grant:r *S-1-5-32-544:(OI)(CI)F /t /c这里使用S-1-5-32-544而不是直接写Administrators是为了避免中文版 Windows 中管理员组名称本地化造成问题。实际执行后已成功处理 95 个文件; 处理 0 个文件时失败随后再次Remove-Item C:\Program Files (x86)\TabFlow -Recurse -Force这次成功。验证Test-Path C:\Program Files (x86)\TabFlow返回False说明程序主体已经删除。九、删除 TabFlow 的卸载注册表残留程序文件删除之后“已安装的应用”中仍然可能保留 TabFlow。查询$locations ( HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall, HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall ) $tabflowEntries foreach ($location in $locations) { Get-ChildItem $location -ErrorAction SilentlyContinue | ForEach-Object { $p Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue if ($p.DisplayName -eq TabFlow) { [PSCustomObject]{ RegistryKey $_.PSPath KeyName $_.PSChildName DisplayName $p.DisplayName UninstallString $p.UninstallString } } } } $tabflowEntries | Format-List本机对应的是HKEY_LOCAL_MACHINE \Software \WOW6432Node \Microsoft \Windows \CurrentVersion \Uninstall \TabFlow确认DisplayName是 TabFlow 后删除$tabflowEntries | ForEach-Object { Remove-Item $_.RegistryKey -Recurse -Force }也可以用reg.exe验证reg.exe query HKLM\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\TabFlow如果返回错误: 系统找不到指定的注册表项或值。说明卸载注册项已经不存在。十、还有一个重要残留计划任务继续搜索Get-ScheduledTask | ForEach-Object { $task $_ foreach ($action in $task.Actions) { if ($($action.Execute) $($action.Arguments) -match TabFlow) { [PSCustomObject]{ TaskName $task.TaskName TaskPath $task.TaskPath Execute $action.Execute Arguments $action.Arguments } } } }实际发现TaskName : TabFlowTray Execute : C:\Program Files (x86)\TabFlow\TabFlowTray.exe Arguments : /autorun --fromtask也就是说TabFlow 还创建了一个自动启动托盘程序的计划任务。删除Unregister-ScheduledTask -TaskName TabFlowTray -TaskPath \ -Confirm:$false如果某些环境中根目录任务使用空 TaskPath也可以根据实际查询结果调整。验证Get-ScheduledTask -TaskName TabFlowTray -ErrorAction SilentlyContinue没有输出即可。十一、清理完成后C 盘/D 盘突然打不开了这一步是整个问题里另一个比较坑的地方。清理 TabFlow 之后在“此电脑”中双击C: D:突然提示找不到应用程序乍一看很像把 Windows 或磁盘搞坏了。实际上硬盘本身没有问题。原因是TabFlow 修改了 Windows 对 Folder 的默认 Shell 打开动作。十二、排查 Windows Shell 文件夹关联执行reg.exe query HKCR\Drive\shell /s然后reg.exe query HKCR\Directory\shell /s以及最关键的reg.exe query HKCR\Folder\shell /s最终发现HKEY_CLASSES_ROOT\Folder\shell (默认) REG_SZ openintabx而继续往下HKEY_CLASSES_ROOT\Folder\shell\openintabx (默认) REG_SZ 资源管理器中打开它对应的 command 是C:\Program Files (x86)\TabFlow\TabFlow64.exe %1这就完全解释了为什么 C/D 盘打不开。十三、C/D 盘为什么会报“找不到应用程序”Windows Shell 对文件夹存在一个默认动作。正常情况下应该使用 Windows 自己的open但是 TabFlow 把HKCR\Folder\shell的默认值修改为了openintabx因此双击一个文件夹/驱动器时Windows 会按照这个 Shell verb 去执行C:\Program Files (x86)\TabFlow\TabFlow64.exe %1但我们前面已经把C:\Program Files (x86)\TabFlow整个删除了。于是 Windows 仍然试图调用一个已经不存在的 EXE最终表现为找不到应用程序所以这里不是 C 盘坏了也不是 D 盘坏了更不是需要格式化磁盘。只是 Windows Shell 默认打开动作仍然残留着 TabFlow 的配置。十四、恢复 Windows 默认 Folder Shell管理员 PowerShellreg.exe add HKCR\Folder\shell /ve /d open /f然后删除 TabFlow 创建的 Shell verbreg.exe delete HKCR\Folder\shell\openintabx /f验证reg.exe query HKCR\Folder\shell应该看到(默认) REG_SZ open然后reg.exe query HKCR\Folder\shell\openintabx应该显示错误: 系统找不到指定的注册表项或值。最后重新启动 ExplorerStop-Process -Name explorer -Force Start-Process explorer.exe此时再次双击 C:、D: 和普通文件夹恢复正常。十五、完整排查思路总结这次问题最重要的经验是对于一个无法正常卸载、并且具有驻留能力的软件不要把“卸载”等同于“删除 Program Files 里的文件夹”。完整清理至少应该考虑程序主体当前运行进程Windows 服务计划任务Run/RunOnce 启动项Startup 启动文件夹卸载注册表项Shell 文件/文件夹关联其他 Explorer Shell 扩展清理后是否存在重新生成/重新安装现象尤其是本次 TabFlow 实际涉及TabFlow64.exe TabFlowTray.exe AloneTrayServer.exe TabFlowSearch.exe TabFlowSvc TabFlowTray计划任务 Folder\shell\openintabx所以单纯执行winget uninstall TabFlow或者uninst.exe并不足以解决问题。十六、不要随便做的事情在处理类似软件时我不建议一上来就关闭 Windows Defender 关闭 SmartScreen 给可疑 EXE 添加 Defender 白名单 批量删除名称中带 TabFlow 的所有注册表项 删除整个 HKEY_CLASSES_ROOT\Folder 删除整个 HKEY_CLASSES_ROOT\Drive尤其不要因为卸载器“无法访问”就关闭安全软件强制运行可疑的uninst.exe。更稳妥的原则是先查清楚具体注册了什么再精确删除对应组件。例如本次修复 C/D 盘时我们没有重置整个文件关联系统只处理HKCR\Folder\shell以及 TabFlow 自己创建的HKCR\Folder\shell\openintabx这样影响范围最小。十七、简略版操作指南下面给只想快速解决问题的人一个简化流程。注意以下命令需要管理员 PowerShell。删除前应确认自己的安装路径、服务名和计划任务与本文一致不建议不检查就机械照抄。1. 查安装位置Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*, HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* -ErrorAction SilentlyContinue | Where-Object {$_.DisplayName -match TabFlow} | Select-Object DisplayName, Publisher, InstallLocation, UninstallString如果确认安装目录为C:\Program Files (x86)\TabFlow再继续下面的操作。2. 杀掉 TabFlow 相关进程$dir C:\Program Files (x86)\TabFlow Get-CimInstance Win32_Process | Where-Object { $_.ExecutablePath -like $dir\* } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue }检查Get-CimInstance Win32_Process | Where-Object { $_.ExecutablePath -like C:\Program Files (x86)\TabFlow\* } | Select-Object ProcessId, Name, ExecutablePath正常情况下应该没有输出。3. 检查 TabFlow 服务不要看到svchost.exe就直接结束它。查询 TabFlow 相关服务Get-ChildItem HKLM:\SYSTEM\CurrentControlSet\Services -ErrorAction SilentlyContinue | ForEach-Object { $svc Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue $params Get-ItemProperty $($_.PSPath)\Parameters -ErrorAction SilentlyContinue if ( $($svc.ImagePath) -like *TabFlow* -or $($params.ServiceDll) -like *TabFlow* ) { [PSCustomObject]{ ServiceName $_.PSChildName ImagePath $svc.ImagePath ServiceDll $params.ServiceDll Start $svc.Start } } }如果和本文一样找到ServiceName : TabFlowSvc ServiceDll : C:\Program Files (x86)\TabFlow\lpi\TabFlowSvc.dll则执行sc.exe stop TabFlowSvc sc.exe config TabFlowSvc start disabled sc.exe delete TabFlowSvc验证sc.exe query TabFlowSvc出现OpenService 失败 1060: 指定的服务未安装。说明已经删除。4. 接管文件夹权限并删除takeown /f C:\Program Files (x86)\TabFlow /a /r /d yicacls C:\Program Files (x86)\TabFlow /reset /t /c /qicacls C:\Program Files (x86)\TabFlow /grant:r *S-1-5-32-544:(OI)(CI)F /t /c然后Remove-Item C:\Program Files (x86)\TabFlow -Recurse -Force验证Test-Path C:\Program Files (x86)\TabFlow返回False说明主体已经删除。5. 清除卸载注册表项先查$locations ( HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall, HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall ) $tabflowEntries foreach ($location in $locations) { Get-ChildItem $location -ErrorAction SilentlyContinue | ForEach-Object { $p Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue if ($p.DisplayName -eq TabFlow) { [PSCustomObject]{ RegistryKey $_.PSPath DisplayName $p.DisplayName UninstallString $p.UninstallString } } } } $tabflowEntries | Format-List确认只有 TabFlow 后$tabflowEntries | ForEach-Object { Remove-Item $_.RegistryKey -Recurse -Force }6. 清理计划任务查询Get-ScheduledTask | ForEach-Object { $task $_ foreach ($action in $task.Actions) { if ($($action.Execute) $($action.Arguments) -match TabFlow) { [PSCustomObject]{ TaskName $task.TaskName TaskPath $task.TaskPath Execute $action.Execute Arguments $action.Arguments } } } }如果和本文一样发现TaskName : TabFlowTray TaskPath : \ Execute : C:\Program Files (x86)\TabFlow\TabFlowTray.exe删除Unregister-ScheduledTask -TaskName TabFlowTray -TaskPath \ -Confirm:$false验证Get-ScheduledTask -TaskName TabFlowTray -ErrorAction SilentlyContinue无输出即可。十八、如果卸载后 C/D 盘或普通文件夹双击报“找不到应用程序”不要慌也不要格式化硬盘。先查询reg.exe query HKCR\Folder\shell /s如果发现HKEY_CLASSES_ROOT\Folder\shell (默认) REG_SZ openintabx并且HKEY_CLASSES_ROOT\Folder\shell\openintabx\command (默认) REG_SZ C:\Program Files (x86)\TabFlow\TabFlow64.exe %1说明原因已经确定TabFlow 把 Windows 文件夹的默认打开方式改成了自己的openintabx而 TabFlow.exe 已经被删除因此 Windows 双击文件夹时找不到目标程序。恢复 Windows 默认动作reg.exe add HKCR\Folder\shell /ve /d open /f删除 TabFlow 的残留 Shell verbreg.exe delete HKCR\Folder\shell\openintabx /f验证reg.exe query HKCR\Folder\shell应该得到(默认) REG_SZ open然后reg.exe query HKCR\Folder\shell\openintabx应该提示找不到该注册表项。最后重启 ExplorerStop-Process -Name explorer -Force Start-Process explorer.exe此时重新双击 C 盘、D 盘和普通文件夹即可。十九、一组命令检查是否清理干净完成上述操作后可以执行Write-Host 程序目录 Test-Path C:\Program Files (x86)\TabFlow Write-Host n 服务 sc.exe query TabFlowSvc Write-Host n 进程 Get-CimInstance Win32_Process | Where-Object { $_.Name -match TabFlow|AloneTrayServer -or $_.ExecutablePath -like *\TabFlow\* } | Select-Object ProcessId, Name, ExecutablePath Write-Host n 计划任务 Get-ScheduledTask | ForEach-Object { $task $_ foreach ($action in $task.Actions) { if ($($action.Execute) $($action.Arguments) -match TabFlow) { [PSCustomObject]{ TaskName $task.TaskName Execute $action.Execute Arguments $action.Arguments } } } } Write-Host n 卸载注册表 reg.exe query HKLM\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\TabFlow Write-Host n Folder 默认打开动作 reg.exe query HKCR\Folder\shell理想结果程序目录 False 服务 1060 / 指定的服务未安装 进程 无输出 计划任务 无 TabFlow 输出 卸载注册表 系统找不到指定的注册表项或值 Folder\shell (默认) REG_SZ open满足这些条件后至少本文实际遇到的 TabFlow 主体、服务、计划任务、卸载信息和文件夹 Shell 关联均已处理。二十、超简版只看这里如果你遇到的现象和本文完全一致排查顺序可以浓缩成① 查进程Get-CimInstance Win32_Process | Where-Object {$_.ExecutablePath -like *\TabFlow\*} | Select-Object ProcessId, Name, ExecutablePath结束确认属于 TabFlow 的进程。② 查服务重点检查TabFlowSvc如果确认存在sc.exe stop TabFlowSvc sc.exe config TabFlowSvc start disabled sc.exe delete TabFlowSvc③ 接管权限takeown /f C:\Program Files (x86)\TabFlow /a /r /d y icacls C:\Program Files (x86)\TabFlow /reset /t /c /q icacls C:\Program Files (x86)\TabFlow /grant:r *S-1-5-32-544:(OI)(CI)F /t /c④ 删除程序Remove-Item C:\Program Files (x86)\TabFlow -Recurse -Force⑤ 查并删除计划任务如果确认存在TabFlowTray执行Unregister-ScheduledTask -TaskName TabFlowTray -TaskPath \ -Confirm:$false⑥ 删除 TabFlow 卸载记录确认注册表项确实属于 TabFlow 后删除对应项。本文机器上的位置是HKLM\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\TabFlow⑦ 如果 C/D 盘突然打不开检查reg.exe query HKCR\Folder\shell /s如果确认默认值被改成openintabx且其 command 指向已经不存在的 TabFlowreg.exe add HKCR\Folder\shell /ve /d open /f reg.exe delete HKCR\Folder\shell\openintabx /f重启 ExplorerStop-Process -Name explorer -Force Start-Process explorer.exe完成。二十一、最后的安全检查清理完成后建议重启 Windows。由于本文遇到的 TabFlow 并非只有一个普通 EXE而是实际注册了 Windows 服务、计划任务并修改了 Folder Shell因此如果它是在用户不知情的情况下被安装的建议再进行一次安全检查。可以打开Windows 安全中心 → 病毒和威胁防护 → 扫描选项至少进行一次完全扫描如果比较担心还可以执行Microsoft Defender 脱机扫描这样可以检查是否还有和 TabFlow 同时进入系统的其他可疑组件。二十二、结语这次处理 TabFlow 最容易踩的坑有两个。第一个是以为删除 EXE 就等于卸载完成。实际上它还存在 Windows 服务和计划任务。尤其TabFlowSvc.dll通过svchost.exe作为服务组件运行时直接删除文件很容易遇到“访问被拒绝”。第二个则更加隐蔽程序删掉以后Windows 的 Shell 配置还指向已经不存在的 TabFlow。这导致清理完成之后反而出现 C 盘、D 盘和文件夹无法双击打开并提示“找不到应用程序”。因此遇到类似软件时我认为比较合理的排查思路应该是确认安装位置 → 查进程 → 查服务 → 查计划任务/启动项 → 停止驻留组件 → 接管文件权限 → 删除程序 → 删除卸载记录 → 检查 Shell 关联 → 重启并安全扫描。不要因为一个卸载器运行不了就直接关闭 Defender也不要看到“找不到应用程序”就开始重装系统。先搞清楚 Windows正在尝试运行什么、是谁让它自动启动、哪个注册表项改变了默认行为通常就能把问题拆开逐个解决。**补充说明**本文记录的是一次具体机器上的实际排查过程。不同版本的 TabFlow、不同安装来源或不同 Windows 环境服务名、安装目录、计划任务和注册表项都可能不同。因此文中的删除命令应建立在“查询结果与本文一致”的前提下使用尤其不要根据关键词批量删除注册表或系统服务。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门