我想通过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非常冗长.