文章关键字 ‘WMI’

WMI中的Win32_PingStatus类

2010年12月8日,星期三

平时很少用到ping命令,所以这个类也没怎么用过,测试了一下,好像效率比ping要高。计算ping 100次demon.tw延迟的平均值。

IP = "demon.tw"
WQL = "Select * from Win32_PingStatus Where Address = '$IP'"
WQL = Replace(WQL,"$IP",IP)
n = 0 : s = 0
Do Until n = 100
    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colItems = objWMIService.ExecQuery(WQL,,48)
    For Each objItem in colItems
        If objItem.StatusCode = 0 Then
            s = s + objItem.ResponseTime
            n = n + 1
        End If
    Next
Loop
WScript.Echo "Average:" & s / n

参考链接:Win32_PingStatus Class

用VBS创建环境变量

2010年12月3日,星期五

今天和一个高手讨论了一下WMI里WQL查询的时间问题,无果。Google时无意中搜到这段代码,mark一下。

strComputer = "."
Set objWMIService = GetObject _
("winmgmts:\\" & strComputer & "\root\cimv2")
Set objVariable = objWMIService._
Get("Win32_Environment").SpawnInstance_
objVariable.Name = "TestValue"
objVariable.UserName = "System"
objVariable.VariableValue = "This is a test"
objVariable.Put_

参考链接:如何使用脚本创建环境变量?

将WMI中的DateTime类型转换成VBS时间

2010年11月17日,星期三

WMI中的DateTime数据类型保存的时间格式是UTC,与VBS中的时间类型不同。

有两种方法可以转换,一种是自己写个函数解析:

Function WMIDateStringToDate(DateTime)
    WMIDateStringToDate = _
    CDate(Mid(DateTime, 5, 2) &_
    "/" &_
    Mid(DateTime, 7, 2) &_
    "/" &_
    Left(DateTime, 4) &_
    " " &_
    Mid (DateTime, 9, 2) &_
    ":" &_
    Mid(DateTime, 11, 2) &_
    ":" &_
    Mid(DateTime, 13, 2))
End Function

另一种是使用SWbemDateTime对象

Function WMIDateStringToDate(DateTime)
   Set WbemDateTime = _
   CreateObject("WbemScripting.SWbemDateTime")
   WbemDateTime.Value = DateTime
   WMIDateStringToDate = WbemDateTime.GetVarDate()
End Function

参考链接:It’s About Time (Oh, and About Dates, Too)

VBS调用WMI搜索文件

2010年10月7日,星期四

如果你想用递归搜索我也没办法。下面的程序搜索电脑上所有的MP3文件。

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
Set colFiles = objWMIService. _
    ExecQuery("Select * from CIM_DataFile where Extension = 'mp3'")
For Each objFile in colFiles
    Wscript.Echo objFile.Name
Next

参考链接:WMI Tasks: Files and Folders

用C语言调用WMI

2010年08月29日,星期日

这只是一篇翻译

你可以用C语言调用WMI。虽然语法有一些不够C++友好,但是它可以工作。COM在初始设计的时候就能在C或C++中工作,COM和WMI的头文件包含对纯C语言的支持。但是程序会比较长……你的程序必须负责为所有对象分配内存,检测每个COM调用的错误,释放它初始化的对象的内存。

在使用用C++格式写的文档的时候,要在心里记着将COM调用从

pSomething->Method(arg1, ...); // C++ 

转换成

pSomething->lpVtbl->Method(pSomething, arg1, ...); // C 

下面就是我可以从WMI获取一些信息的最短的C代码片段。如果运行成功,将返回你电脑上的CPU列表和它们的时钟频率(以MHz为单位)。程序小心的释放了它分配的所有资源,但是没有做任何的错误处理(你必须在继续下一步之前检测hr的值)。

这是一个visual studio 2008(Demon注:经过我的测试,VC6.0也可以)的Win32控制台程序。为了让程序成功编译,确保在工程属性中包含wbemuuid.lib,在Configuration Properties/Linker/Input/Additional Dependencies下。(Demon注:我在程序中多加了一行#pragma comment(lib,"wbemuuid.lib"),可以不用配置)

(更多…)