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

来源:互联网 发布:手机淘宝怎么做详情 编辑:程序博客网 时间:2024/05/16 15:09
        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改名或删除,然后再测试一下,发现客户所报的问题得到解决了。这样问题的根源和解决方法我们都找到了,临时解决方法就是很多把对应的图片改名或删除,最终解决方法就是把那个模糊查询改成指定字段的查询。

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

0 0
原创粉丝点击