一个WMI模糊查询引发的数据丢失问题

在客户环境中,发现特定图标与操作系统定制有关,深入研究后发现图标信息存储在OEMLogoBitmap属性中。问题源于WMI模糊查询影响,删除或修改相应注册表值及图片文件后,问题得到解决。此案例强调避免使用模糊查询以防止类似问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        WMI查询语句 “SELECT * FROM Win32_ComputerSystem” 是一个看起来很简单的查询,主要用于获取Windows 系统的一些信息,如机器名、处理器数量等。在我们的产品上这个语句使用很久了,一直没问题。最近有个客户报产品在获取数据时,偶尔出现获取不到数据的情况,导致在个别图表上出现空白。经过定位,发现的获取语句“SELECT * FROM Win32_ComputerSystem”的查询结果时,好像一直在遍历着什么东西,可能跟这个查询有关,但这个查询我们在本地已经测试过很多次,每次查询都可以很快返回结果的,而且也没有客户报过有关这个查询的问题。

        不过我们还是要验证一下,就让客户在他们的环境上通过wbemtest运行一下“SELECT * FROM Win32_ComputerSystem”,结果发现需要等一两分钟才有结果返回,由此我们断定,在客户环境上,这个查询存在性能问题,可能在获取某些东西的时候需要比较多的时间。

        由于我们只需要在这个语句上查询处理器数量,我们在客户环境上,试着运行“SELECT NumberOfProcessors FROM Win32_ComputerSystem”, 这回很快就可以返回结果了。那到底是什么东西在导致那个模糊查询存在性能问题呢?

        接着我们检查客户环境,当我们点击“我的电脑->属性”时,发现在弹出窗口有一个定制的图标,平时在我们电脑上是没有看到这个图标的,由于客户的操作系统是跟微软定制,加入了自己公司的logo在里面,这就有点类似我们以前的雨木林风之类的XP系统,在“我的电脑->属性”可以看到这方面的图标,查询了微软的文档https://msdn.microsoft.com/en-us/library/windows/desktop/aa394102%28v=vs.85%29.aspx,发现这个图标对应OEMLogoBitmap这个属性,也就是说把图片信息读取后,转换成uint8类型存储,会不会是这个属性影响的?

OEMLogoBitmap
    Data type: uint8 array
    Access type: Read-only
    Qualifiers: MappingStrings ("WMI")

        征得客户同意后,我们从注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation把 logo的值删除,或者把该值所指向的目录的图片改名或删除,对于旧的Xp系统,则把C:\Windows\System32\oemlogo.bmp改名或删除,然后再测试一下,发现客户所报的问题得到解决了。这样问题的根源和解决方法我们都找到了,临时解决方法就是很多把对应的图片改名或删除,最终解决方法就是把那个模糊查询改成指定字段的查询。

     通过这个例子也进一步看到,无论是什么查询语句,数据库的还是其它的,能不使用模糊查询就别使用模糊查询。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值