在WMI中更新数据库条目的方式(以及频率)如何?

时间:2011-03-23 03:23:46

标签: windows wmi internals

我们需要为我们的Windows客户端计算机设计监控应用程序,并且我正在追踪有关WMI架构的一些信息。我们当前的计划是使用相当简单的VBScript脚本定期查询数据库,将相关信息写入平面文件,以便以后传输到中央服务器(我们的非Windows机器已经存在所有繁重的分析和报告。

我曾尝试在MSDN和网络上寻找这个问题的答案,但所有文章看起来特别“蓬松” - 很多“如何使用它”,但很少“内部如何工作”。

以VBScript段为例:

set wmi = getObject("winmgmts:\\.\root\cimv2")
set itemCpu = wmi.get("Win32_PerfRawData_PerfOS_Processor.Name='_Total'")
n = itemCpu.PercentProcessorTime

或:

set wmi = getObject("winmgmts:\\.\root\cimv2")
set colMem = wmi.execQuery(
    "select AvailableKBytes from Win32_PerfRawData_PerfOS_Memory",,48)

现在,我知道这些内容会发送到CIM数据库并检索相关条目,而我认为 收集信息到该数据库之间存在脱节现象它的提取

换句话说,无论是否有人从所述数据库请求信息,Windows都会收集统计信息并将其写入数据库。我的理解最好总结为:

+------------+    req/       ======== 
| Monitoring |     resp     /        \     stats    +------------+
|  Processes |  <------->  < Database >  <--------  | Collectors |
|            |              \        /              +------------+
+------------+               ======== 

\_____________________________/    \_____________________________/
         On-demand                        Always happening

但我对数据库填充的过程感兴趣。比如:

  • 我们如何判断Windows“收藏家”在多长时间内以及在何种情况下将信息添加到数据库中?
  • Windows内核是否在每个任务切换上写入进程信息?
  • 是否每秒都会写入内存信息?
  • 是否只按需更新数据库(当监控应用程序请求信息时)?

这就是我想要找到的东西。

是否有人拥有此类信息,或链接到有关此主题的具有技术头脑的文章或白皮书?

2 个答案:

答案 0 :(得分:1)

我不确定您需要的信息是否在任何地方都有详细记录。

根据我对WMI的理解,它完全基于消费者/提供者机制及其负责保持信息最新的提供者的实施。你的脚本就是消费者。

我可以推荐给你的一本书是Craig Tunstall和Gwyn Cole的“开发WMI解决方案”。它大约有800页,我认为它确实包含了任何想要使用WMI的人的详细信息,包括开发消费者应用程序和自定义提供程序。

http://www.amazon.com/Developing-WMI-Solutions-Management-Instrumentation/dp/0201616130

答案 1 :(得分:1)

简而言之,WMI元数据库会实时更新。例如,查看系统时区类:

wmic timezone get /all /format:list

然后更改系统区域区域设置并再次重新检查时区类。

UAC(从Win VISTA开始)在WMI基础架构中发挥了重要作用: http://msdn.microsoft.com/en-us/library/windows/desktop/aa826699(v=VS.85).aspx

这篇文章(相当不错)描述了CIM架构:http://www.wbemsolutions.com/tutorials/CIM/index.html

这篇MSDN文章描述了MOF:http://msdn.microsoft.com/en-us/library/windows/desktop/aa823192(v=vs.85).aspx

总而言之,重新填充CIM数据库时没有严格的规则,这取决于系统当时正在做什么和/或用户做了什么。