【发布时间】:2011-07-18 17:53:43
【问题描述】:
我想知道是否有任何 win32 类可以检测硬盘是 eide 还是 sata。提前致谢。
【问题讨论】:
标签: powershell wmi
我想知道是否有任何 win32 类可以检测硬盘是 eide 还是 sata。提前致谢。
【问题讨论】:
标签: powershell wmi
如other answer 中所述,驱动器的标题(即型号名称)可能包含此信息,您可以导航 WMI 对象关联,直到您找到具有更明确名称/标题/其他属性的设备。
保持devmgmt.msc 在视图中打开 |开发时通过连接打开的设备将使事情变得更容易。
导航 WMI 对象图的关键是 "ASSOCIATORS OF" 查询。
所以(使用大量别名和其他快捷方式使这更容易:我会在我计划重用的东西中避免这种情况):
gwmi win32_DiskDrive |
%{gwmi -query "ASSOCIATORS OF {$($_.__RELPATH)} where resultclass = Win32_PnpEntity"}
将为每个磁盘驱动器获取Win32_PnpEntity 对象。
在第一个(出于探索目的)磁盘驱动器上重复此操作到另一个级别以查找存在的关联类型:
gwmi win32_DiskDrive |
%{gwmi -query "ASSOCIATORS OF {$($_.__RELPATH)} where resultclass = Win32_PnpEntity" |
%{gwmi -query "ASSOCIATORS OF {$($_.__RELPATH)}"}} | fl __CLASS,__RELPATH
显示混合的 WMI 类:
__CLASS : Win32_SystemDriver __RELPATH : Win32_SystemDriver.Name="磁盘" __CLASS : Win32_ComputerSystem __RELPATH : Win32_ComputerSystem.Name="主机名" __CLASS : Win32_IDEController __RELPATH : Win32_IDEController.DeviceID="PCIIDE\\IDECHANNEL\\4&5ECF4F&0&2" __CLASS : CIM_DataFile __RELPATH : CIM_DataFile.Name="c:\\windows\\system32\\drivers\\disk.sys" __CLASS : Win32_DiskDrive __RELPATH : Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE0"最后一个只是导航回磁盘驱动器,每个设备都与一个计算机系统相关联。但是那个Win32_IDEController 对象看起来很有趣。
它有一个 ProtocolSupported 属性,其中包含不同总线的值,但这里的所有实例都是 37(“IDE”),并且控制器通道和控制器都有实例:
所以它不会像获得Win32_IDEController 那样容易。
返回并为我的磁盘扩展与Win32_PnpDevice 关联的Win32_IDEController:
gwmi win32_DiskDrive |
%{gwmi -query "ASSOCIATORS OF {$($_.__RELPATH)} where resultclass = Win32_PnpEntity" |
%{gwmi -query "ASSOCIATORS OF {$($_.__RELPATH)} where resultclass = Win32_IDEController"}} |
fl Caption,Description
标题:ATA 通道 2
描述:IDE通道
那是 SATA 通道,该通道会与控制器关联吗?并简化:foreach-object 的输出不需要内部管道:
gwmi win32_DiskDrive |
%{gwmi -query "ASSOCIATORS OF {$($_.__RELPATH)} where resultclass = Win32_PnpEntity"} |
%{gwmi -query "ASSOCIATORS OF {$($_.__RELPATH)} where resultclass = Win32_IDEController"} |
%{gwmi -query "ASSOCIATORS OF {$($_.__RELPATH)} where resultclass = Win32_IDEController"} |
fl __CLASS,__RELPATH.Caption,Description
这什么也没找到,但稍作探索(从一个查询中捕获 __RELPATH 以粘贴到另一个查询中以控制管道)表明遵循关联:
DiskDrive --> PnpDevice --> IDEContoller --> PnpDevice --> IDEController
应该得到结果。避免循环(因为 IDEController 有两个关联的 PnpDevice 对象)留作练习。
一旦到达真正的控制器,就需要解析标题。
在另一个系统上重复查询控制器给出了三个 Standard Dual Channel PCI IDE Controller 实例,尽管有 四个 控制器(1×IDE 和 3×SATA),这可能与由于非平凡映射有关以 RAID 运行?
当然,SATA 具有与 IDE 基本相同的逻辑(编程)接口,以使新硬件与软件一起工作(PCI 和 PCI-Express 也是如此)意味着操作系统并不需要知道。
【讨论】:
没有直接的方法可以找到它。但是,您可以使用 Win32_DiskDrive 的标题属性并对其进行解析以查看您是否有 ATA 或 SCSI 磁盘。在我的系统上,SATA 磁盘有一个标题ST9500420AS ATA Device。
你这样做的方式是:
Get-WMIObject -Class Win32_DiskDrive | Select Caption, Index
您可以解析 Caption 属性以查找它是否包含 ATA 或 SCSI。
【讨论】:
我知道,这个问题有点老了,但是使用另一个 WMI-Object 怎么样:
Get-WmiObject -Class MSFT_PhysicalDisk -Namespace root\Microsoft\Windows\Storage | Select FriendlyName, MediaType, BusType
BusType 2 代表 ATAPI,3 代表 ATA,11 代表 SATA。还有一些是 USB、SCSI 或 SSD。根据维基百科 (https://en.wikipedia.org/wiki/Parallel_ATA),ATA 和 ATAPI 都是硬盘的并行接口 (IDE / EIDE)。
据我所知,该对象从 Windows 7 开始可用,并提供了许多有趣的值。
【讨论】:
@Richard 的回答很棒,但在这一点上有点过时了。
他的代码可以在较新版本的 Powershell (v3+) 上得到显着简化。此外,在 Powershell v6+ 上,旧的 Get-WmiObject 命令根本不再可用。在这两种情况下,您都可以使用Get-CimInstance 命令和Get-CimAssociatedInstance 命令:
Get-CimInstance -ClassName Win32_DiskDrive -KeyOnly |
Get-CimAssociatedInstance -ResultClassName Win32_PnpEntity -KeyOnly |
Get-CimAssociatedInstance -ResultClassName Win32_IDEController |
Select-Object CreationClassName, DeviceID, Caption, Description |
Format-List
Get-CimInstance 的工作原理与Get-WmiObject 基本相同,尽管它在大多数情况下提高了输出。 Get-CimAssociatedInstance 完成了所有令人讨厌的 ASSOCIATORS OF 事情,您过去必须手动使用 gwmi。
-KeyOnly 参数告诉管道中较早的命令返回它们返回的对象的唯一标识符。由于我们只希望管道中的早期命令能够识别硬件项目,因此无需让这些命令返回任何其他内容。
也就是说,在具有Get-Volume、Get-Partition、Get-PhysicalDisk 或 Get-Disk 的较新版本的 Powershell 上,上述内容可能是不必要的。如果您使用的是较新版本的 Windows,您可能只需要运行 Get-PhysicalDisk | Select-Object FriendlyName, BusType。通过这种方式,您通常可以获得更好(尽管不一定完美)的属性。
您仍然可以使用 CIM 类,但请注意 CIM mapping between the different newer CIM storage classes is complicated,因为它可以表示相当复杂的安排,但是当您知道它们中的大多数可以通过 MSFT_StorageSubSystem 时,它会有所帮助。
例如,这会为您提供与驱动器 C 关联的物理磁盘:
Get-CimInstance -Namespace ROOT/Microsoft/Windows/Storage -ClassName MSFT_Volume -Filter "DriveLetter='C'" -KeyOnly |
Get-CimAssociatedInstance -ResultClassName MSFT_StorageSubSystem -KeyOnly |
Get-CimAssociatedInstance -ResultClassName MSFT_PhysicalDisk |
Select-Object -Property FriendlyName, SerialNumber, MediaType, BusType, Size, OperationalStatus, ObjectID -Unique
注意命名空间ROOT/Microsoft/Windows/Storage必须在第一个命令中指定,因为新的存储类不在默认命名空间中。
在这里,-Unique 参数以及在物理磁盘上包含 ObjectID 属性有助于确保该命令不会由于事物的映射方式而返回重复项。这是理查德的回答所讨论的“坏消息”的一部分。
【讨论】: