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

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

这比我想象的更复杂。 尽pipe读取状态属性足够简单,但我发现Capabilities属性中有一些有趣的内容 – 即表示是否有“SMART Notification”的值。 除非命令在提升的安全上下文中运行,否则不会显示此值。 因此,例如,如果我运行(gwmi win32_diskdrive).Capabilities SMART值(10)不会出现在值的数组中,但如果我运行在它出现的提升的提示。 据我所知,你不能在一个提升的背景下运行一个winrm会话(我对cheesy 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

它显示了接口types(IDE)型号(ST3250312AS)固件版本(JC47),我认为是某种types的唯一标识符( 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 

win32_diskdrive的PNPDeviceID属性都是IDE\DiskST3250312AS_____________________________JC47____\5&350bf0c3&0&0.0.0

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

编辑

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

 SCSI\Disk&Ven_TOSHIBA&Prod_MBF2600RC\5&354ecb35&0&000200_0 SCSI\Disk&Ven_TOSHIBA&Prod_MBF2600RC\5&354ecb35&0&000300_0 

如果没有人能够肯定地证实这一点,那么在一天左右,我只会假设这个价值实际上是独一无二的,并将其标记为“答案”。

“当你分开两路之前,走第三条路……”〜特拉维亚谚语

脚本

这是我用来从多台机器获取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) 

这会让你输出像:

 PSComputerName PredictFailure Reason InstanceName -------------- -------------- ------ ------------ 4CZ1***** False 0 IDE\DiskHitachi_HTS723225A7A364_________________ECBOA60W\4&35e86db3&0... 2UA0***** False 0 IDE\DiskST3160318AS_____________________________HP35____\5&5df8cfa&0&... 

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

Win32_diskdrive vs MSStorageDriver_FailurePredictStatus

关于win32_diskdriveMSStorageDriver_FailurePredictStatus属性的问题… MSStorageDriver_FailurePredictStatus是在root\wmi命名空间中的MSStorageDriver的王朝(与MSStorageDriver类存在的root\cimv2不同而不同),并且从inheritance中获取它的非特定于类的属性。 MSStorageDriver从硬件(无提供者)获取数据。 win32_diskdrive拥有自己的PNPDeviceID属性,它使用提供者Win32_DiskDrivePhysicalMedia 。 两者都从硬件中查询相同的数据,但是分别进行。

上面那个获取InstanceName脚本与下面的PNPDeviceID相同:

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

结论

 (gwmi -Namespace root\wmi -Class MSStorageDriver_FailurePredictStatus).InstanceName 

获取与以下相同的数据:

 (gwmi -Class Win32_DiskDrive).PNPDeviceID 

评论参考

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

设备树

实例ID

如果使用属于远程计算机本地pipe理员组成员的域帐户连接到远程WMI名称空间,则UAC令牌筛选不应生效。

当我说connect时,我的意思是指定Get-WMIObject计算机参数(对不起,不是别名的粉丝),我是可读性和可维护性的忠实粉丝!