Я пытался получить информацию о дисках удаленных машин, в том числе о том, включен ли SMART на диске, с помощью класса win32_diskdrive.
Это сложнее, чем я думал. Хотя прочитать свойство статуса достаточно просто, я обнаружил кое-что интересное в свойстве Capabilities, а именно значение, обозначающее, доступно ли «SMART Notification». Это значение не будет отображаться, если команда не будет запущена в контексте повышенной безопасности. Так, например, если я запускаю (gwmi win32_diskdrive) .Capabilities, то значение SMART (10) еще не появляется в массиве значений, если я запускаю его в приглашении с повышенными правами, оно появляется. Насколько я знаю, вы не можете запустить сеанс WinRM в повышенном контексте (и меня не интересуют дрянные взломы schtasks или psexec).
Итак, я попытался сопоставить win32_diskdrive с классом MSStorageDriver_FailurePredictStatus. Я думаю, что мне все равно придется это сделать, потому что даже если SMART отображается в свойстве Capabilities, это не обязательно означает, что он включен, правильно?
Я сопоставлял свойство PNPDeviceID win32_diskdrive со свойством InstanceName MSStorageDriver_FailurePredictStatus, но теперь моя проблема в том, что я не думаю, что свойство 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
он показывает некоторую информацию о диске, поэтому я не думаю, что этот номер уникален. Это означает, что уникальность заключается в номере индекса, который не включен в свойство PNPDeviceID класса win32_diskdrive. Это проблема, поскольку многие из наших серверов имеют несколько идентичных дисков.
Меня беспокоит то, что 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
И свойство PNPDeviceID Win32_diskdrive всех из них будет просто 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
Если никто не может окончательно подтвердить это, через день или около того, я просто предполагаю, что это значение действительно уникально, и отмечу это как «ответ».
«Когда дорога перед вами разделяется на две части, выбирайте третий путь ...» ~ Телаксианская пословица
Сценарий
Это сценарий, который я использовал для получения данных 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
против MSStorageDriver_FailurePredictStatus
свойства ... MSStorageDriver_FailurePredictStatus
находится в династии 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
Ссылки на комментарии
Этот раздел содержит ссылки, предназначенные для ссылки на дополнительную информацию из раздела комментариев этого ответа.
Если вы подключаетесь к удаленному пространству имен WMI с использованием учетной записи домена, которая является членом локальной группы администраторов удаленного компьютера, фильтрация маркеров UAC не должен вступят в силу.
Когда я говорю "подключиться", я имею в виду указание -компьютер параметр для Get-WMIObject (извините, не фанат псевдонимов - я большой поклонник удобочитаемости и ремонтопригодности!).