powershell: Como verificar se o S.M.A.R.T está habilitado em máquinas remotas

8

Eu estava tentando obter informações de disco de máquinas remotas, incluindo se o SMART está habilitado ou não no disco usando a classe win32_diskdrive.

Isso é mais complicado do que eu pensava. Embora seja bastante fácil ler a propriedade status, descobri algo interessante na propriedade Capabilities, ou seja, o valor que indica se "SMART Notification" está disponível. Esse valor não aparecerá, a menos que o comando seja executado em um contexto de segurança elevado. Por exemplo, se eu executar (gwmi win32_diskdrive) .Capabilities o valor SMART (10) não aparece na matriz de valores ainda se eu executá-lo em um prompt elevado ele aparecer. Tanto quanto eu sei que você não pode executar uma sessão winrm em um contexto elevado (e eu não estou interessado em hacks schtsks queijo ou psexec).

Então eu tentei mapear win32_diskdrive para a classe MSStorageDriver_FailurePredictStatus. Eu acho que teria que fazer isso de qualquer maneira, porque mesmo que o SMART apareça na propriedade Capabilities, isso não significa necessariamente que ele está ativado corretamente?

Eu estava mapeando a propriedade PNPDeviceID de win32_diskdrive para a propriedade InstanceName de MSStorageDriver_FailurePredictStatus, mas agora meu problema é que não acho que a propriedade InstanceName seja exclusiva o suficiente para que isso funcione. Por exemplo, aqui está o meu InstanceName: IDE\DiskST3250312AS_____________________________JC47____&350bf0c3&0&0.0.0_0

Ele mostra o tipo de interface (IDE) o número do modelo (ST3250312AS), a versão do firmware (JC47), o que eu achava ser um identificador único de algum tipo ( 5&350bf0c3&0&0.0.0 ) e o que parece ser um número de índice (_0). Quando eu google 5&350bf0c3&0&0.0.0 , aparece alguma informação na unidade, então não acho que esse número seja único. Isso significa que a exclusividade está no número de índice que não está incluído na propriedade PNPDeviceID da classe win32_diskdrive. Isso é um problema porque muitos dos nossos servidores têm vários discos idênticos.

Minha preocupação é que MSStorageDriver_FailurePredictStatus representaria vários discos como este:

IDE\DiskST3250312AS_____________________________JC47____&350bf0c3&0&0.0.0_0
IDE\DiskST3250312AS_____________________________JC47____&350bf0c3&0&0.0.0_1
IDE\DiskST3250312AS_____________________________JC47____&350bf0c3&0&0.0.0_2

E a propriedade PNPDeviceID de win32_diskdrive de todos eles seria apenas IDE\DiskST3250312AS_____________________________JC47____&350bf0c3&0&0.0.0

Como posso mapear com segurança objetos recuperados de win32_diskdrive para MSStorageDriver_FailurePredictStatus ou fazer isso de outra maneira com o powershell por meio de sessões remotas?

Editar :

Bem, parece que eu estava exagerando. Quando eu verifiquei um monte de servidores, encontrei InstanceNames \ PNPDeviceIDs assim:

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

Se ninguém puder confirmar isso de forma conclusiva, em um ou dois dias, apenas assumirei que esse valor é realmente único e marque isso como a "resposta".

    
por red888 07.10.2013 / 21:06

2 respostas

5

"Quando a estrada antes de você se dividir em dois, pegue um terceiro caminho ..." ~ Provérbio Telaxiano

Script

Este é o script que usei para obter os dados SMART de várias máquinas. Já habilitei winrm nos dispositivos usados neste exemplo.

$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) 

Isso gerará uma saída como:

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

Notas do script: No arquivo de texto, tenho um nome de host listado por linha. Não há vírgula separando os dados. Além disso, os computadores que não possuem unidades inteligentes não serão exibidos no relatório. Você pode personalizar o relatório com mais opções de dados para selecionar, basta executar um Select * em vez das opções que usei no script para ver o despejo completo.

Win32_diskdrive vs MSStorageDriver_FailurePredictStatus

Na questão de win32_diskdrive vs MSStorageDriver_FailurePredictStatus properties ... O MSStorageDriver_FailurePredictStatus está na dinastia de MSStorageDriver no namespace root\wmi (que é separado e distinto de root\cimv2 em que a classe win32_diskdrve exists) e obtém propriedades não específicas da herança. O MSStorageDriver obtém seus dados diretamente do hardware (nenhum provedor). Onde, como win32_diskdrive tem sua própria propriedade PNPDeviceID que usa o provedor Win32_DiskDrivePhysicalMedia . Ambos consultam os mesmos dados do hardware, mas o fazem separadamente.

Esse script acima de onde fica o InstanceName é o mesmo que PNPDeviceID abaixo:

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

Conclusão

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

Obtenha os mesmos dados de:

(gwmi -Class Win32_DiskDrive).PNPDeviceID

Referências de comentários

Esta seção contém links destinados a referenciar informações adicionais da seção de comentários desta resposta.

Árvore de dispositivos

IDs de instâncias

    
por 08.10.2013 / 20:07
1

Se você se conectar ao namespace remoto do WMI usando uma conta de domínio que seja membro do grupo de administradores locais do computador remoto, a filtragem de token do UAC não deve entrar em vigor.

Quando digo connect, quero dizer especificando o parâmetro -computer para Get-WMIObject (desculpe, não sou fã de alias - sou um grande fã legibilidade e facilidade de manutenção!).

    
por 08.10.2013 / 21:16