2014-03-31 102 views
1

我會監視我的Windows 7客戶端上的智能HDD。如何閱讀HDD S.M.A.R.T.屬性?

我想在沒有使用任何vbs文件或現成的工具來看待WMI或PowerShell的情況下獲得硬盤智能屬性。

我會用ZABBIX監控服務器(使用zabbix-sender.exe)來聚合這些數據。

我發現Linux或多或少的解決方案,但我會監視Windows 7機器硬盤。

有沒有人有想法?

回答

5

使用WMI API來訪問像這樣SMART數據,

gwmi -namespace root\wmi -class MSStorageDriver_FailurePredictStatus 

There處於淨多examples

+1

很遺憾,它沒有提供足夠的信息。 我會得到基於ID的vaues。像 03 - spin_up_time 00 – GergA

0

下面是一個PowerShell腳本,用於從smartctl(smartmontools)輸出中提取所有屬性數據。如果路徑不在%path%中,請調整路徑到smartctl。

它可以像這樣使用:

.\get-smart.ps1 -Drive hda -AttributeId 5,241 -Property Name,Raw -FriendlyOutput 

或只是

.\get-smart.ps1 hda 5,241 Name,Raw -f 

等等。如果你指定-FriendlyOutput它格式化數據表,否則,它給你的對象。 如果你在一個特定的值只是感興趣,請

.\get-smart.ps1 hda 241 Raw 

注意某些性能,如門檻,不存在,如果是smartctl讀取不以管理員身份運行。

還沒有異常處理!你被警告了!

param(
    [Parameter(Mandatory=$True)] 
    [string] $Drive, 
    [int[]]  $AttributeId, 
    [string[]] $Property, 
    [switch] $FriendlyOutput) 
# parses attribute table in smartctl output and builds an object 
$smart = [string[]](smartctl -A $Drive) 
[email protected]() 
foreach ($s in $smart) { 
    if ($s -match '^\s*(\d+)\s+(\w+)\s+(\w+)\s+(\d+)\s+(\d+)\s+([\d-]+)\s+([\w-]+)\s+(\w+)\s+([\w-]+)\s+(\d+)') { 
     $o = new-object -Typename PSObject 
     add-member -in $o -m NoteProperty -name 'ID' -value ([int]$matches[1]) 
     add-member -in $o -m NoteProperty -name 'Name' -value $matches[2] 
     add-member -in $o -m NoteProperty -name 'Flag' -value $matches[3] 
     add-member -in $o -m NoteProperty -name 'Value' -value ([int]$matches[4]) 
     add-member -in $o -m NoteProperty -name 'Worst' -value ([int]$matches[5]) 
     add-member -in $o -m NoteProperty -name 'Threshold' -value ([int]$matches[6]) 
     add-member -in $o -m NoteProperty -name 'Type' -value $matches[7] 
     add-member -in $o -m NoteProperty -name 'Updated' -value $matches[8] 
     add-member -in $o -m NoteProperty -name 'WhenFailed' -value $matches[9] 
     add-member -in $o -m NoteProperty -name 'Raw' -value ([int64]$matches[10]) 
     $attributes += $o 
    } 
} 
if ($AttributeId){ 
    $attributes = $attributes | ? {$_.id -in $attributeid} 
} 
if ($Property){ 
    if ($property.count -gt 1 -and $attributes.count -gt -0 -and $Property -notcontains 'id'){ 
     # if more than one result and more than one attribute, add the ID to the output 
     $property = ,'id'+$Property 
    } 
    $attributes = $attributes | select $Property 
} 
if (@($attributes).count -eq 1 -and @($attributes.psobject.properties).count -eq 1){ 
    # return single values directly instead of an object 
    $attributes.psobject.properties.value 
} elseif ($FriendlyOutput){ 
    $attributes | ft * -a 
} else { 
    $attributes 
}