通过COM自动化使用WScript.Shell / FileSystemObject时的句柄泄漏(Windows Server 2022)
我正在调查一个可能与Windows COM对象相关的句柄泄漏问题,来自第三方应用程序的使用。
该应用程序(Elipse E3 SCADA)运行的是 VBScript代码,用以实例化Windows COM对象,主要是:
WScript.ShellScripting.FileSystemObject
这些对象用于:
- 执行外部命令(
WScript.Shell.Run) - 创建/写入临时文件(
Scripting.FileSystemObject)
在某些环境中,承载脚本引擎的进程会持续累积句柄,最终达到数百万级别,导致操作系统不稳定。
观测到的行为
一个简化的模式示例:
Set sh = CreateObject("WScript.Shell")
sh.Run "cmd /c echo test", 0, False
Set sh = Nothing
这段代码定期执行。
在受影响的系统中,每次执行都会增加进程句柄数量(每次执行几个句柄),且数量不会回到此前的水平。
可以通过以下方式观察句柄的增长:
- PowerShell
Get-Process(HandleCount) - Sysinternals Process Explorer
环境对比
我们在多个环境中进行了测试:
- Windows Server 2022(构建 20348.3932)
- Windows Server 2022(构建 20348.4773)
结果:
- 在某些 Windows Server 2022系统上,句柄数量会持续增长。在同一操作系统版本的其他 系统上,该问题则不会发生。
这表明该行为可能与以下差异有关:
- Windows Script Host组件
- COM运行时
- 系统库或更新
问题
是否有人知道Windows Server 2022中的某些更新或组件可能影响此行为?
关于可能的原因、诊断方法或推荐的替代方案的任何建议都将不胜感激。
谢谢。
解决方案
经过一番调查,我发现句柄增长并非由应用本身引起,而是由其与安全代理的交互所致。
该代理(cynetMS)似乎会劫持进程,可能导致句柄随着时间增加。
为验证这一点:
- 移除了代理 → 问题消失
- 重新安装后 → 问题又出现
下一步,我们将尝试在代理中为该应用添加白名单,以防止此行为。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。