写这篇记录的时候,我手里这台测试机的 C 盘还残留着一个删不掉的SangforPWE目录,系统里那个saio服务也始终倔强地停在“运行中”,普通模式下sc stop直接报“拒绝访问”。这就是很多人遇到过的局面:电脑之前装过深信服(Sangfor)的终端管理或准入类客户端,某些组件卸载不干净,最后在系统里留了一个“钉子户”。这篇文章不是官方的卸载教程,而是我个人在这次删除Sangfor PWE过程中踩坑、试错、最终成功清理的完整记录。我会把整个过程拆开来讲,包括 PWE 是什么、为什么它这么难删、具体怎么一步步清理、以及我在“执行服务权限失败”和“无法粉碎 sangfor 目录”这两个问题上是怎么绕过去的,希望对正在跟它较劲的人有点帮助。
1. 先搞清楚:Sangfor PWE 到底是什么?为什么这么难删?
1.1 它不是一个普通的“文件夹”
在动手之前,我建议大家先花两分钟弄清楚自己电脑里的SangforPWE到底是个什么东西,因为这决定了你后续要用什么级别的工具去处理它。
PWE 这个缩写,在深信服的产品体系里一般对应终端管理和准入控制相关组件。它通常不是单独安装的,而是随着深信服的 EDR、全网行为管理、桌面管理或者准入客户端一起被装进系统,负责终端合规检查、外设管控、网络准入握手这类工作。换句话说,这属于企业IT统一分发的安全/管理软件的一部分,不是你在官网下载的普通应用。所以我这台机器上既有Sangfor相关目录,又有一个名为saio的服务,服务描述还跟终端安全、准入相关,那么 PWE 基本可以定位为“整个客户端里负责底层策略执行的那一块”。
为什么它难删?因为它不是普通软件。这类终端管理组件在设计上就做了自我保护:服务注册成系统服务、目录设置了严格的 ACL 权限、可能还有驱动在底层监听,一旦检测到有人试图停止服务或者删除关键文件,就会拒绝操作或者自动恢复。表现出来的症状就是最典型的那几个:
- 控制面板卸载程序列表里找不到 PWE 独立卸载项;
services.msc里能看到saio服务,但右键“停止”是灰色的,或者点了提示拒绝访问;- 用管理员权限执行
sc stop saio,提示“服务未启动”或“拒绝访问”; - 资源管理器里删除
C:\Program Files\Sangfor\PWE之类的目录,提示“你需要来自 SYSTEM 的权限”; - 用各种粉碎工具想强制删除,结果还是失败。
如果你现在遇到的症状和上面几条重合,那就可以确定是同一类问题。这种自我保护机制和 Windows 本身的文件权限机制叠到一起,就是“目录无法删除、服务权限失败”的根源。
1.2 删除前必须做的三件事
在进入正题之前,我要先强调三件事,这三件事能帮你少走很多弯路,甚至避免把系统搞崩。
第一,确认这台电脑是否还在公司管理域内。如果你是在公司配发的电脑上操作,那我强烈建议你先联系 IT,让他们从服务端下发卸载指令,或者至少确认你的操作不会违反公司安全策略。强行删除终端管理组件的后果可能是失去合规状态、被安全团队告警,甚至触发终端锁定。这篇文章的方法更适用于离职清理、测试环境复现、或者你不确定这台设备是从哪儿装上了这个东西的情况。
第二,备份重要数据,并考虑创建系统还原点。删除系统服务、修改注册表、takeown 权限授予这些操作,都是有一定风险的。我在实际操作前先在管理 PowerShell 里执行了Checkpoint-Computer创建还原点,同时把 C 盘用户目录下的项目文件做了快照备份。别嫌麻烦,万一后面有哪个重启出问题,你能有个后悔的机会。
第三,准备好必要的工具。我实际用到的是:一个管理员权限的 PowerShell、Sysinternals 的 Process Explorer、一个可以进安全模式的 U 盘或者系统引导方式,以及一个能在底层操作文件的 PE 环境启动盘(这个我是最后才用上的,但确实关键)。如果实在没有 PE 环境,Windows 自带的“安全模式”也能解决大部分问题。
2. 从服务入手:saio 和 PWE 相关服务到底怎么处理?
2.1 先摸清有哪些服务在打架
我第一次尝试删除 PWE 目录的时候,系统提示文件被占用。这个“占用”通常不是一个文件句柄那么简单,而是有几个服务在维持着整个模块的运作。所以正确的顺序,永远是把服务停掉、禁用、删掉,然后再去碰文件。
你先在管理员 PowerShell 里跑一条命令,把名字里带 Sangfor、PWE、saio 的服务全部列出来:
Get-Service | Where-Object { $_.Name -like "*sangfor*" -or $_.Name -like "*pwe*" -or $_.Name -like "*saio*" -or $_.DisplayName -like "*sangfor*" -or $_.DisplayName -like "*saio*" } | Format-List Name, DisplayName, Status, StartType我这台机器上的结果大致是:
| 服务名 | 显示名 | 状态 | 启动类型 |
|---|---|---|---|
| saio | Sangfor AIO Service | 运行中 | 自动 |
| SanGUI | Sangfor GUI 相关 | 运行中 | 自动 |
| PWEAgent | PWE Agent Service | 运行中 | 自动 |
实际版本不同的时候服务名可能有差异,但这不影响思路:先确认它们的存在,再逐个处理。这里我建议不要一上来就sc delete saio,因为服务还在运行的话,直接删注册表项会失败,或者删了重启后又被某个守护机制拉起来。正确做法是:先停服务,再禁服务,最后才删。
2.2 用 sc 命令停止服务时被拒绝访问?问题在这里
我最初执行:
sc stop saio返回的是[SC] ControlService 失败 5: 拒绝访问。
这个错误我太熟悉了。很多朋友卡在这一步,就是因为不理解“为什么我明明是管理员,还是被拒绝访问”。原因通常是:服务自身设置了只允许 SYSTEM 或特定账户控制,或者有内核级驱动保护。这时候直接懵的话,后面的每一步都会卡壳。
我的处理办法是,去注册表里临时提高当前用户的权限。注意,这不是常规操作,但只针对清理场景是有效的。服务项的注册表位置在:
HKLM\SYSTEM\CurrentControlSet\Services\saio在这个项上右键,选“权限”,把当前管理员账户添加进去,并勾选“完全控制”。改完之后再尝试停止服务。这一步的本质是“先用权限工具绕过 ACL 限制”,它不一定每次都能生效,因为如果 PWE 有驱动在保护服务控制接口,ControlService还是会失败。
如果这一步还是不行,那就切换思路,直接从启动方式上“断粮”。不要试图在正常模式下强行停止服务,而是找到服务对应的可执行文件路径,然后进安全模式里处理。这背后的逻辑是:安全模式下,第三方的服务和驱动不会被加载,PWE 的自我保护几乎完全失效,你就能以 SYSTEM 权限做很多事情。后面第 3 节会详细讲我具体怎么操作的。
这里还有一个很多人忽略的细节:即使你成功把服务停掉了,也别急着去删文件,先去任务管理器确认相关进程已经没了,比如saio.exe、pwe_agent.exe之类的进程如果还在跑,文件还是没法删。可以用 Process Explorer 按进程名搜索句柄,看到哪个进程打开了 PWE 目录下的文件,直接结束进程再继续。如果进程结束不掉,说明有驱动守护,那就直接切到安全模式再执行。
3. 目录权限处理:takeown 和 icacls 的正确用法
3.1 移除 SYSTEM 保护:把你变成文件所有者
当服务停了之后,你再去删除 PWE 目录,大概率会收到这样的提示:
你需要来自 SYSTEM 的权限才能对此文件夹进行更改。
这就涉及 Windows 文件系统层的权限问题了。PWE 目录的 ACL 里可能只有 SYSTEM 有完全控制,管理员都被移除了。解决办法是用takeown接管所有者,再用icacls重新分配权限。
以C:\Program Files (x86)\Sangfor\PWE为例,我执行的是:
takeown /F "C:\Program Files (x86)\Sangfor\PWE" /R /D Y icacls "C:\Program Files (x86)\Sangfor\PWE" /grant administrators:F /T /C /Q这两条命令的意思分别是:递归地把目录所有者改为当前管理员组;递归地给管理员组授予完全控制权。
如果你在某个文件上还是提示权限不足,可以加#或者用icacls ... /reset重置整个 ACL。但这里我要提个醒:/grant administrators:F只对当前这台机器的管理员组有效,如果你用的不是内置 Administrator 账户,而是普通用户加入了管理员组,有可能还是遇到“无法枚举容器中的对象”,这种情况就先切换到内置 Administrator 账户再操作。
我真正踩坑的地方是在这里:takeown和icacls都提示成功,但目录里有一个sysdata.db文件依然无法删除,提示“文件正在被另一个进程使用”。当时正常模式下的相关服务已经被我停掉了,任务管理器里也没有明显相关的进程,但文件还是被占用。后来我用 Process Explorer 搜索句柄,发现是一个名为fltMgr.sys相关的文件系统过滤驱动在占用它。
这就要引出我下面要说的重要操作:进安全模式。
3.2 安全模式才是真正的“突破口”
在正常模式下花了半天时间之后,我意识到 PWE 的自我保护比我预想的强,单纯靠常规手段很难彻底解决。我当时的选择是:重启进入安全模式(带网络功能不是必须的,但为了保险可以选带网络),然后用安全模式下的管理员账号继续删除操作。
具体做法是:
- 按住 Shift 同时点击“重启”;
- 依次进入“疑难解答” → “高级选项” → “启动设置” → “重启”;
- 在启动设置列表里按键 4 或 5 选择“启用安全模式”或“启用安全模式(带网络)”。
进入安全模式之后,再次打开管理员 PowerShell,先看看 saio 服务的状态:
sc query saio安全模式下,第三方服务默认不会启动,所以你会发现服务的状态通常是“已停止”。这时候再去执行:
sc delete saio大概率就能成功。如果提示“指定的服务已标记为删除”,说明服务控制管理器已经接受了删除请求,重启后就会彻底移除。同理,把其他跟 Sangfor/PWE 相关的服务也按这个顺序处理。
服务清理干净之后,再回到C:\Program Files (x86)\Sangfor\PWE,用del /f /q或者资源管理器删除,你就会发现之前那些“文件被占用”“权限不足”的报错都消失了。我这次实际就是在安全模式下把整个Sangfor目录成功删掉的。删除之后我没有立刻重启,而是在安全模式下又顺手检查了一遍计划任务和启动项,确保没有“复活”机制残留。
从操作逻辑上讲,安全模式相当于把 PWE 的保护层剥掉了——它的驱动、服务、进程都不工作,剩下的就是一个普通目录 + 普通文件,Windows 的常规删除权限就足够处理了。这也是我整个清理过程里最核心的一次突破。
4. 如何彻底清除注册表、计划任务和启动项残留
4.1 服务删干净了,注册表里还有一堆东西
很多人以为把服务停了、目录删了就算完,其实 PWE 这类软件还会在注册表里留下大量残留。比如服务项如果sc delete失败,你就要手动去注册表里把对应项删掉;还有一些卸载信息、自启动项、COM 组件注册等。
服务相关的注册表路径我检查了两个地方:
HKLM\SYSTEM\CurrentControlSet\Services HKLM\SYSTEM\CurrentControlSet\Services\DriverDatabase在Services下搜索“saio”“sangfor”“pwe”关键词,把匹配到的文件夹全部删除。但这里要注意,不是所有叫SaIO的都一定是深信服的残留,有的可能是别的软件缩写。删除前用关键词或者路径信息再核对一下,保险起见可以先把要删除的项右键导出备份成.reg文件,删错了还能恢复。
另外还要检查卸载信息注册表项,在那里能看到“控制面板程序和功能”里的残留条目:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall搜索带有 Sangfor、PWE 字样的项。如果存在,直接删除对应子项。这样“软件列表里的残留”也算清干净了。
4.2 计划任务和 Run 键:防“复活”的关键
折腾过几次之后,我意识到这个软件最怕的不是第一次删除难,而是删完之后重启它又自动回来了。一次重启之后,我检查发现saio服务又出现了,当时肺都要气炸了。后来排查发现原因是计划任务和 Run 注册表项里各有一个守护任务。
在taskschd.msc(任务计划程序)里,我找到了名字类似于SangforUpdate、PWEStart之类的计划任务,它们被设置为“计算机启动时运行”,指向的脚本会把相关服务重新注册并启动。计划任务库位置一般是:
任务计划程序库\Microsoft\Windows\Sangfor把整个Sangfor文件夹删掉即可。如果删除时提示权限不足,可以右键“导出”任务为 XML 备份,然后右键删除;如果还删不掉,同样要到安全模式下处理。
注册表 Run 键这里也要检查:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run我那次是在HKCU的 Run 键里发现了一个指向 PWE 目录下rpc_helper.exe的启动项,删掉之后才算真正断了复活的路。
这里我建议再用一个更彻底的手段:用 Process Monitor 这类工具在重启之后抓一下进程启动链。但如果你不想折腾,至少要做到“服务删干净 + 计划任务删干净 + Run 键删干净”这三点,基本就能保证它不会再自己跑回来了。
4.3 顺手清理认领驱动和文件系统过滤驱动
还有一个比较容易被忽略的位置,是文件系统过滤驱动。这类安全管理软件为了监控文件读写,一般会注册一个过滤驱动。如果驱动还在,即使服务删了、文件删了,它也可能在系统启动时加载并报错,或者在设备管理器里出现一个黄感叹号。
你可以在管理员 PowerShell 里查看:
fltmc filters如果看到名字带Sangfor或PWE的过滤驱动,可以尝试用:
fltmc unload <驱动名>但这只是临时卸载,要彻底删除还是得进注册表:
HKLM\SYSTEM\CurrentControlSet\Services\<驱动名>把这个服务项删除,同时到C:\Windows\System32\drivers下删除对应的.sys文件。如果删不掉,进安全模式再删。驱动这块非常容易忽略,但影响又很大,因为它不清理的话,系统日志里可能会持续报错。
5. 遇到“目录无法粉碎”“执行服务权限失败”时的终极方案
5.1 再试一试这些命令,不行就上 PE
有些时候,连安全模式都会遇到“目录无法粉碎”的问题。我在处理另一台机器时遇到过:saio服务删除成功,但C:\Program Files (x86)\Sangfor\PWE目录在安全模式下还是提示“找不到项目”“无法删除文件夹”。这种情况下,通常不是权限问题,而是文件系统层面有损坏,或者目录里有特殊的连接点、命名流文件。
几个针对性的命令可以交叉使用:
# 先看目录里到底有什么隐藏/系统属性的文件 attrib -s -h -r "C:\Program Files (x86)\Sangfor\PWE" /s /d # 尝试重置目录 ACL icacls "C:\Program Files (x86)\Sangfor\PWE" /reset /T /C /Q # 使用 cmd 的 rd 命令强制删除 rd /s /q "C:\Program Files (x86)\Sangfor\PWE"如果rd提示“文件名、目录名或卷标语法不正确”,那多半是目录里有畸形命名的文件,或者是 Windows 认为路径中有不可见字符。这时候我建议你直接把整个目录改名再删:
ren "C:\Program Files (x86)\Sangfor\PWE" "SangforPWE_Old" rd /s /q "C:\Program Files (x86)\Sangfor\PWE_Old"改名往往能绕过很多文件系统层的锁定,因为这个操作不要求遍历全部文件内容。
如果这些都失败了,那就只能上 PE 环境了。你可以做一个包含 PE 的启动 U 盘(比如微PE、优启通等),进入 PE 之后,你会发现 PWE 目录就像普通文件一样,直接右键删除即可。PE 环境不加载系统里的服务和驱动,所以再强的自我保护在 PE 里都毫无意义。这件事给我最大的教训就是:别把时间浪费在和一个“钉子户”硬碰硬上,换一个环境,它就普通得不能再普通了。
5.2 我踩过的两个特殊坑:权限失败和粉碎工具误报
关于“执行服务权限失败”这个热词,我再多说一点。sc stop报“拒绝访问”不代表你无计可施,还有一个更直接的办法是调整服务本身的安全描述符,但这里操作比较复杂,弄不好会影响系统里其他服务。我的建议是:优先安全模式,其次 PE,不要在正常模式和它的保护机制死磕。
另外关于“粉碎工具”,我看网上很多人推荐用各种粉碎工具来删除 Sangfor 目录,我自己也试过几款。说实话,大部分粉碎工具在对付普通软件残留时是没问题的,但对付 PWE 这类带驱动的安全软件,粉碎工具大概率会失败,原因是删除请求会被文件系统过滤驱动拦截,工具本身又没有办法绕过驱动层。有些粉碎工具会显示“已粉碎”,但重启之后目录又出现,这其实就是典型的“假删除”——文件目录项被标记删除,但底层数据还在。所以我后来干脆不用粉碎工具,专心把服务、驱动、计划任务一个个清干净,反而效果更好。
如果你真的想用工具,我建议用 Sysinternals 的pendmoves和movefile,它们利用 Windows 的“重命名/删除文件在重启后执行”机制,配合DeleteFile标记,比普通粉碎工具要可靠一些。但我个人的最终方案是安全模式 + PE 手动删除,简单粗暴,而且一劳永逸。
6. 全文清理操作路线总结(自查清单)
到这里,整个删除 Sangfor PWE 的过程我已经讲完了。为了方便你照着操作,我把整个流程整理成了一张清单一图流,你可以边操作边核对。
| 阶段 | 操作内容 | 核心命令 / 操作位置 |
|---|---|---|
| 1. 枚举现状 | 查看服务、目录、进程、驱动 | Get-Service、fltmc filters、Process Explorer |
| 2. 停止服务(正常模式尝试) | 停服务、禁服务 | sc stop saio、sc config saio start=disabled |
| 3. 绕过权限(注册表 ACL) | 给当前管理员加完全控制 | regedit到服务项,权限设置 |
| 4. 进入安全模式 | 停残留服务、删除服务 | sc delete saio、删除Services注册表项 |
| 5. 处理文件目录 | 接管所有者、重置 ACL、删除目录 | takeown、icacls、rd /s /q |
| 6. 清理计划任务和启动项 | 删除守护任务和 Run 项 | taskschd.msc、regedit |
| 7. 清理驱动 | 卸载文件系统过滤驱动 | fltmc unload、删除 drivers 下.sys |
| 8. 终极手段 | 改名删除、PE 环境删除 | ren+rd、PE U 盘 |
我个人在实际操作中的体会是,整个过程最耗费时间的不是删除本身,而是“定位”和“排查”。你得先搞清楚这个 PWE 到底依托哪些服务、哪些驱动存在,然后按照“禁用服务 → 停进程 → 删服务 → 删驱动 → 删文件 → 清注册表和计划任务”的顺序一层层剥,每一步操作前先确认当前状态,操作后重启验证。如果中间某一步失败,就果断切安全模式或者 PE 环境,不要在一个环节上钻牛角尖。
最后再分享一个小技巧:如果你不确定服务、文件是否真的删干净了,可以用reg query和dir命令再搜一遍关键词,比如:
reg query HKLM\SYSTEM\CurrentControlSet\Services | findstr /i "sangfor pwe saio" dir "C:\Program Files*" | findstr /i "sangfor"确保输出为空,再重启验证。我第一次就是只删了目录没删计划任务,结果计划任务又把服务拉起来了,重启后看到saio服务死而复生的时候,那叫一个崩溃。把这套流程走完,PWE 才算真正从系统里彻底请出去了。