powershell:如何检查远程机器上是否启用了 SMART

red*_*888 8 powershell smart wmi winrm

我试图获取远程机器的磁盘信息,包括是否使用 win32_diskdrive 类在驱动器上启用了 SMART。

这比我想象的要棘手。虽然读取 status 属性很容易,但我在 Capabilities 属性中发现了一些有趣的东西——即表示“智能通知”是否可用的值。除非该命令在提升的安全上下文中运行,否则不会出现此值。因此,例如,如果我运行 (gwmi win32_diskdrive).Capabilities SMART 值 (10) 尚未出现在值数组中,如果我在提升的提示中运行它,它确实会出现。据我所知,您无法在提升的上下文中运行 winrm 会话(而且我对俗气的 schtasks hacks 或 psexec 不感兴趣)。

然后我尝试将 win32_diskdrive 映射到 MSStorageDriver_FailurePredictStatus 类。我想无论如何我都必须这样做,因为即使 SMART 出现在 Capabilities 属性中,也不一定意味着它已启用,对吗?

我正在将 win32_diskdrive 的 PNPDeviceID 属性映射到 MSStorageDriver_FailurePredictStatus 的 InstanceName 属性,但现在我的问题是我认为 InstanceName 属性不够独特,无法正常工作。例如,这是我的 InstanceName:IDE\DiskST3250312AS_____________________________JC47____\5&350bf0c3&0&0.0.0_0

它显示接口类型 (IDE) 型号 (ST3250312AS) 固件版本 (JC47) 我认为是某种唯一标识符 ( 5&350bf0c3&0&0.0.0) 然后看起来像索引号 (_0)。当我用谷歌搜索时,5&350bf0c3&0&0.0.0它会在驱动器上找到一些信息,所以我认为这个数字不是唯一的。这意味着唯一性存在于索引号中,该索引号未包含在 win32_diskdrive 类的 PNPDeviceID 属性中。这是一个问题,因为我们的许多服务器都有多个相同的磁盘。

我担心的是,这MSStorageDriver_FailurePredictStatus将代表多个磁盘,如下所示:

IDE\DiskST3250312AS_____________________________JC47____\5&350bf0c3&0&0.0.0_0
IDE\DiskST3250312AS_____________________________JC47____\5&350bf0c3&0&0.0.0_1
IDE\DiskST3250312AS_____________________________JC47____\5&350bf0c3&0&0.0.0_2
Run Code Online (Sandbox Code Playgroud)

而所有这些的 win32_diskdrive 的 PNPDeviceID 属性就是 IDE\DiskST3250312AS_____________________________JC47____\5&350bf0c3&0&0.0.0

如何MSStorageDriver_FailurePredictStatus通过远程会话可靠地将从 win32_diskdrive 检索到的对象映射到powershell 或以另一种方式执行此操作?

编辑

好吧,看来我反应过度了。当我检查一堆服务器时,我发现 InstanceNames\PNPDeviceIDs 是这样的:

SCSI\Disk&Ven_TOSHIBA&Prod_MBF2600RC\5&354ecb35&0&000200_0
SCSI\Disk&Ven_TOSHIBA&Prod_MBF2600RC\5&354ecb35&0&000300_0
Run Code Online (Sandbox Code Playgroud)

如果没有人能够在一天左右的时间内最终确认这一点,我将假设该值实际上是唯一的并将其标记为“答案”。

Col*_*337 5

“当你之前的路一分为二时,走第三条路……”~特拉仙谚语

脚本

这是我用来从多台机器获取 SMART 数据的脚本。我已经winrm在本示例中使用的设备上启用。

$aComputers = Get-Content C:\ComputerSMARTDriveTest.txt

 (Get-WmiObject -ComputerName $aComputers -namespace root\wmi –class MSStorageDriver_FailurePredictStatus -ErrorAction Silentlycontinue |  
    more |
    Select PSComputerName,PredictFailure,Reason,InstanceName |
    Format-Table –Autosize) 
Run Code Online (Sandbox Code Playgroud)

这会让你输出如下:

PSComputerName PredictFailure Reason InstanceName                                                            
-------------- -------------- ------ ------------                                                            
4CZ1*****              False      0 IDE\DiskHitachi_HTS723225A7A364_________________ECBOA60W\4&35e86db3&0...
2UA0*****              False      0 IDE\DiskST3160318AS_____________________________HP35____\5&5df8cfa&0&...
Run Code Online (Sandbox Code Playgroud)

脚本注释: 在文本文件中,我每行列出一个主机名。没有逗号分隔数据。此外,报告中不会显示没有启用智能驱动器的计算机。您可以使用更多数据选项自定义报告以供选择,只需运行 aSelect *而不是我在脚本中使用的选项即可查看完整转储。

Win32_diskdrive 与 MSStorageDriver_FailurePredictStatus

关于win32_diskdrivevsMSStorageDriver_FailurePredictStatus属性的问题......在命名空间MSStorageDriver_FailurePredictStatus中的王朝(它是独立的并且与类存在的地方不同)并且从继承中获取它是非类特定的属性。在得到它的数据从硬件(无供应商)直接。哪里有它自己的财产,它使用 provider 。两者都从硬件查询相同的数据,但分别进行。MSStorageDriverroot\wmiroot\cimv2win32_diskdrveMSStorageDriverwin32_diskdrivePNPDeviceIDWin32_DiskDrivePhysicalMedia

上面的脚本InstanceNamePNPDeviceID下面的相同:

(Get-WmiObject -ComputerName $aComputers -Namespace root\cimv2 -Class win32_diskdrive `
    -ErrorAction Continue |
    more |
    select PNPDeviceID |
    Format-Table -AutoSize)
Run Code Online (Sandbox Code Playgroud)

结论

(gwmi -Namespace root\wmi -Class MSStorageDriver_FailurePredictStatus).InstanceName
Run Code Online (Sandbox Code Playgroud)

获取与以下相同的数据:

(gwmi -Class Win32_DiskDrive).PNPDeviceID
Run Code Online (Sandbox Code Playgroud)

评论参考

本部分包含旨在引用此答案评论部分中的其他信息的链接。

设备树

实例 ID