Pages - Menu

2018年5月16日 星期三

PowerShell 檢查硬碟狀態發送line通知

有一台機器,有些時候會發生iSCSI自動消失。
但一消失,HV虛擬機器就掛了..
某天(也就是昨天),突然想到應該可以用powershell寫一下判斷,再發個mail通知一下。
早上就開始拼拼湊湊,最後生出來了。

下面的程式中,有些驗證的地方請自行輸入,
line_Notify的authorization,可以去看前面的文章。
line_bot 有用過的人,應該就知道了,沒用過的,表示你目前還不需要
詳細說明請看最後面。



Function line_bot
{
         $Header = @{
         'Authorization' = 'Bearer QzMr8WmAdB04t89/1O/w1cDnyilFU='
     }
     $postParams =  @"
{
     "to": "U26157baaaad3c3",   
     "messages": [
         {           
             "text": "F槽已經消失",
             "type": "text"
         }
     ]
    
}
"@
     Invoke-WebRequest -Uri https://api.line.me/v2/bot/message/push -Method POST -ContentType 'application/json' -Headers $Header -Body $postParams
}
Function sendMail
{
     $EmailFrom = "daim@aco.com.tw" #郵件帳號
     $EmailTo = "daim@aao.com.tw,yum@haail.com" #收件人
     $Subject = "HyperV-01 Disk Issue Deteced!" 
     $SMTPServer = "aaa" #SMTP郵件主機位置
     $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 25)
     $SMTPClient.EnableSsl = $false
     $SMTPClient.Credentials = New-Object System.Net.NetworkCredential("daaaom@faatw", "aaa"); #郵件帳號密碼
     $SMTPClient.Send($EmailFrom, $EmailTo, $Subject, "Error,The Disk F is gone")
}
Function line_notify
{
     $Header = @{
         'Authorization' = 'Bearer 3OzaaaafNeUk7Rw7lcjoC'
     }
     $postParams = @{
         'message' = 'Error~!!The Disk F is gone'
     }
     Invoke-WebRequest -Uri https://notify-api.line.me/api/notify -Method POST -ContentType 'application/x-www-form-urlencoded' -Headers $Header -Body $postParams
 
}

$detail = Get-WmiObject -Query 'Select * From Win32_PnPEntity where deviceid ="SCSI\\DISK&VEN_QNAP&PROD_ISCSI_STORAGE\\1&1C121344&0&000000"'
$count = @($detail).Count
echo $count
if($count -eq 0){   
     line_notify
     sendMail
}

簡單敘述碰到的問題,
一開始使用Get-Disk 來抓硬碟資料,其實也可以
(要特別注意Get-Disk只能在win10以及server2012以上),

$WMI = Get-Disk -0
if($WMI.OperationalStatus -eq "Online"){
     line_notify
}

可以查狀態是否在線上,但當機子的硬碟消失時,無法確定他是不是處於offline
最後就放棄這個方式。

改從 Get-WmiObject 去將硬體資訊撈出來。上面的$detail變數,是去win32_pnpEntity裡面
撈硬體資訊出來。這邊需要一點SQL的語法。
如果一開始不知道deviceID的話,
先下

Get-Partition
Get-WmiObject -Query 'Select * From Win32_PnPEntity' | Out-File -FilePath i:\bb.txt

從Get-Partition可以得到 DiskPath,

image
如果是server 2012 R2 ,請改下
 get-disk 2 | Format-List  (ref. Get-Disk Info)
取得 path後再去搜尋

再來將Win32_PnPEntity 資料匯出成文字檔(ref. Out-File),
再去搜尋DIskPath裡面的幾個關鍵字串,
例如 1&1c121344&0&000000  或  prod_iscsi_storage 諸如此類的,
再去找到裡面的DeviceID 就能夠利用where 去搜尋看有沒有這個裝置。



利用@(detail).Count 取得加總(ref. stack overflow)
echo 把數字印出來,
再使用if 判斷如果沒有該裝置該怎麼處理

因為使用了很多東西,所以乾脆寫成function,
powershell使用funcion要特別注意,程式是由上往下執行。
所以,你上面使用了自定義的function,會找不到你自定義的function

LineNotify使用 POST 方式,將值丟給Line,使用  Invoke-WebRequest
發mail則是參考別人寫好的 參考網頁
Line_bot,要特別注意,他是使用raw的方式做body的參數 ,
所以寫法有點不一樣(ref. stactoverflow)

要使用POST的話,最好是先使用postman丟值測試過。

沒有留言:

張貼留言