如何用PowerShell检查硬盘驱动器是否是eide或sata

时间:2011-03-19 12:56:02

标签: powershell wmi

我想知道是否有任何win32类可以检测硬盘驱动器是eide还是sata。提前谢谢。

4 个答案:

答案 0 :(得分:9)

other answer中所述,驱动器的标题(即型号名称)可能包含此信息,您可以导航WMI对象关联,直到找到具有更明确名称/标题/其他属性的设备。 / p>

使用View |保持devmgmt.msc打开在开发过程中打开Connection的设备将使事情变得更容易。

导航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="disk"

__CLASS   : Win32_ComputerSystem
__RELPATH : Win32_ComputerSystem.Name="hostname"

__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”),控制器通道控制器都有实例:

PS[64bit] C:\bin\PowerShell> gwmi win32_idecontroller | ft -auto -wrap caption,description

caption                                  description
-------                                  -----------
ATA Channel 1                            IDE Channel
ATA Channel 0                            IDE Channel
ATA Channel 1                            IDE Channel
Standard AHCI 1.0 Serial ATA Controller  Standard AHCI 1.0 Serial ATA Controller
Standard AHCI 1.0 Serial ATA Controller  Standard AHCI 1.0 Serial ATA Controller
Standard Dual Channel PCI IDE Controller Standard Dual Channel PCI IDE Controller
ATA Channel 0                            IDE Channel
ATA Channel 1                            IDE Channel
ATA Channel 2                            IDE Channel
ATA Channel 3                            IDE Channel
ATA Channel 4                            IDE Channel
ATA Channel 5                            IDE Channel
ATA Channel 0                            IDE Channel

所以这并不像去Win32_IDEController那么容易。

返回并展开与我的磁盘Win32_IDEController相关联的Win32_PnpDevice

gwmi win32_DiskDrive |
  %{gwmi -query "ASSOCIATORS OF {$($_.__RELPATH)} where resultclass = Win32_PnpEntity" |
    %{gwmi -query "ASSOCIATORS OF {$($_.__RELPATH)}  where resultclass = Win32_IDEController"}} |
  fl Caption,Description
caption     : ATA Channel 2
description : IDE Channel

这是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)意味着操作系统并不需要知道。

答案 1 :(得分:2)

没有直接的方法可以找到它。但是,您可以使用Win32_DiskDrive的标题属性并解析它以查看您是否具有ATA或SCSI磁盘。在我的系统上,SATA磁盘有一个标题ST9500420AS ATA Device

你这样做的方式是:

Get-WMIObject -Class Win32_DiskDrive | Select Caption, Index

您可以解析Caption属性以查找它是否包含ATA或SCSI。

答案 2 :(得分:0)

我知道,这个问题有点老了,但是使用另一个 WMI-Object 怎么样:

1
1
1
 {1 2}

BusType 2 代表 ATAPI,3 代表 ATA,11 代表 SATA。还有一些是 USB、SCSI 或 SSD。根据维基百科 (https://en.wikipedia.org/wiki/Parallel_ATA) ATA 和 ATAPI 都是用于硬盘的并行接口 (IDE / EIDE)。

据我所知,该对象从 Windows 7 开始就可用,并提供了许多有趣的值。

答案 3 :(得分:0)

@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 可以完成您过去必须使用 gwmi 手动完成的所有令人讨厌的 ASSOCIATORS OF 事情。

-KeyOnly 参数告诉管道中较早的命令返回它们返回的对象的唯一标识符。由于我们只需要管道中的早期命令来识别硬件项目,因此不需要让这些命令返回任何其他内容。

也就是说,对于具有 Get-VolumeGet-PartitionGet-PhysicalDiskGet-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 属性有助于确保命令不会因事物的映射方式而返回重复项。这是理查德回答所讨论的“坏消息”的一部分。