c – 如何加入WMI查询(WQL)

我想通过WQL查询获取boot-harddisk的序列号.

可以使用以下查询检索引导分区:

SELECT * FROM Win32_DiskPartition where BootPartition=True

序列号在Win32_DiskDrive中:

SELECT DeviceID, SerialNumber FROM Win32_DiskDrive

Win32_DiskDriveToDiskPartition具有Win32_DiskDrive到Win32_DiskPartition的映射.
它们在Win32_DiskDriveToDiskPartition中映射到Win32_DiskDrive.DeviceID到Win32_DiskPartition.DeviceID

如何构建内部加入Win32_DiskPartition和Win32_DiskDrive的WQL查询?
我是否必须使用Associate?或者它是否与INNER JOIN一起使用?

解决方法:

WQL不支持JOIN子句.您猜测时需要使用ASSOCIATORS OF语句.这是VBScript中的一个例子:

strComputer = "." 
Set oWMI = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 

Set colPartitions = oWMI.ExecQuery( _
    "SELECT * FROM Win32_DiskPartition WHERE BootPartition=True") 

For Each oPartition in colPartitions 

    Set colDrives = oWMI.ExecQuery( _
        "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" _
        & oPartition.DeviceID & "'} WHERE ResultClass=Win32_DiskDrive")

    For Each oDrive in colDrives
        WScript.Echo oDrive.SerialNumber
    Next

Next

但请注意,Windows Vista之前的Win32_DiskDrive.SerialNumber属性不可用.因此,如果您希望代码也适用于早期的Windows版本(例如Windows XP或Windows 2000),则应考虑使用WMI以外的API.

编辑:(回复评论)是的,您可以添加嵌套的ASSOCIATORS OF查询以获取与Win32_DiskDrive实例对应的Win32_PhysicalMedia实例;这样的事情:

...
For Each oDrive in colDrives
    Set colMedia = oWMI.ExecQuery( _
        "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" _
        & oDrive.DeviceID & "'} WHERE ResultClass=Win32_PhysicalMedia")

    For Each oMedia in colMedia
        WScript.Echo oMedia.SerialNumber
    Next
Next

你还没有说过你正在使用什么语言 – 我想在PowerShell或C#中,整个事情可以更优雅地完成,但VBScript非常冗长.

上一篇:javascript-单元格范围上的Google Spreadsheet Script RegEx


下一篇:javascript – 如何通过Web浏览器更改系统上的注册表设置