我尝试使用 win32_diskdrive 类来获取远程机器的磁盘信息,包括驱动器上是否启用了 SMART。
这比我想象的要棘手。虽然读取 status 属性很容易,但我在 Capabilities 属性中发现了一些有趣的东西 - 即表示“SMART 通知”是否可用的值。除非在提升的安全上下文中运行该命令,否则不会出现此值。因此,例如,如果我运行 (gwmi win32_diskdrive).Capabilities,则 SMART 值 (10) 不会出现在值数组中,但如果我在提升的提示符下运行它,它就会出现。据我所知,您无法在提升的上下文中运行 winrm 会话(而且我对低俗的 schtasks 黑客或 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
所有这些 win32_diskdrive 的 PNPDeviceID 属性都将是
IDE\DiskST3250312AS_____________________________JC47____\5&350bf0c3&0&0.0.0
我如何才能可靠地映射从 win32_diskdrive 检索到的对象,MSStorageDriver_FailurePredictStatus
或者通过远程会话使用 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
如果没有人能够确切地证实这一点,那么在一两天内,我就会假设这个值实际上是唯一的,并将其标记为“答案”。
答案1
“当你面前的路一分为二时,选择第三条路...”〜特拉克西亚谚语
脚本
这是我用来从多台机器获取 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 *
不是我在脚本中使用的选项即可查看完整转储。
Win32_diskdrive 与 MSStorageDriver_FailurePredictStatus
win32_diskdrive
关于vsMSStorageDriver_FailurePredictStatus
属性的问题... 位于命名空间中MSStorageDriver_FailurePredictStatus
的朝代(与类所在的位置分开且不同),并从继承中获取非类特定的属性。直接从硬件获取数据(无提供程序)。 而 as有自己的属性,它使用提供程序。 两者都从硬件查询相同的数据,但分别进行。MSStorageDriver
root\wmi
root\cimv2
win32_diskdrve
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
评论参考
本节包含用于引用此答案的评论部分的附加信息的链接。
答案2
如果使用属于远程计算机本地管理员组的域帐户连接到远程 WMI 命名空间,则 UAC 令牌筛选不应该生效。
当我说连接时,我的意思是通过指定-电脑参数获取 WMIObject(抱歉,我不喜欢别名 - 我更喜欢可读性和可维护性!)。