昨天有个客户反馈,在一台Win10电脑上运行 傲瑞通(OrayTalk),结果点击联系人时,右边的聊天窗口始终出不来。现象如下图所示:

一. 问题排查
于是,我们远程到客户的这台电脑上,发现这台电脑有装企业防水墙(驱动级自动文件加密),并且傲瑞通的日志内容有如下报错记录:
System.Drawing.Image.FromFile: 内存不足。
找到傲瑞通的安装目录,进入图片资源文件夹查看,发现图片文件都被防水墙加密。如下图所示,黄色小锁为文件加密标记。

到这里,问题已经基本清楚了:客户电脑部署防水墙,程序目录下所有PNG图标文件会被自动加密。当程序使用Image.FromFile()读取加密图片时,直接抛出「内存不足」报错。
当在防水强中设置目标文件夹下的图片不加密后,程序即可正常加载图标,聊天窗口就可以正常打开了。
二、根本原因 说明
我们专门了解了一下防水墙的加密原理,并结合GDI+的报错信息,发现:
-
防水墙加密会修改PNG文件二进制结构,增加加密头,文件不再是标准图片;
-
GDI+解析异常文件时,无法识别图像数据,抛出误导性「内存不足」提示(实际上并非真的物理内存不够);
-
解密后文件恢复标准PNG格式,程序工作就恢复正常了。
这是我们第一次接触装有企业防水墙的电脑,企业防水墙全称数据防泄漏防水墙,属于内网数据安全系统,其核心目标是管控企业内部各类数据、防止核心资料外泄。
由于图片被防水墙加密,而导致.NET程序运行异常。又涨知识了,在这里记录做个备忘,也希望对后来者有所帮助!