但一消失,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,
如果是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丟值測試過。
0 意見:
張貼留言