我们需要为我们的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
但我对数据库填充的过程感兴趣。比如:
这就是我想要找到的东西。
是否有人拥有此类信息,或链接到有关此主题的具有技术头脑的文章或白皮书?
答案 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数据库时没有严格的规则,这取决于系统当时正在做什么和/或用户做了什么。