トップ回答者
Get-Process で取得した内容によってメールを発信したい

質問
-
Get-Processを下記のように記述しました。
Get-Process -ComputerName "ipアドレス" -Name "Prog*"
結果
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
177 7 12712 19668 78 7416 PROG001
183 7 13036 20128 78 9908 PROG002
183 8 17964 25116 86 6244 PROG003
183 7 12236 19328 74 10040 PROG004通常、この4つのプロセスが起動しているのが正しいのですが
そのうち一つでも終了した時に、どのプロセスが終了したかをメールで
通知したいのですがどのようにすればいいでしょうか?
よろしくお願いいたします。
回答
-
ありがとうございました。
なんとか自己解決しました。
お手数をお掛けしてすみません。
こんな風になりました。
$lst = get-process -name "PROG*" | SELECT-OBJECT NAME
$ctr=0
foreach ($value in $lst)
{
$PROG001 = "X"
$PROG002 = "X"
$PROG003 = "X"
$PROG004 = "X"switch -r ($value)
{
"PROG001" { $ctr += 1 }
"PROG001" { $PROG001 = "O"}
"PROG002" { $ctr += 1 }
"PROG002" { $PROG002 = "O"}
"PROG003" { $ctr += 1 }
"PROG003" { $PROG003 = "O"}
"PROG004" { $ctr += 1 }
"PROG004" { $PROG004 = "O"}
}
}if ($ctr -ne 9)
{
$date = get-date
$body = "$date `n"
$body = $bofdy + "常駐ソフトが終了しました。`n"
$body = $body + "*******************************************`n"
$body = $body + "* 停止=X *`n"
$body = $body + "*******************************************`n"
$body = $body + "B001 -> " + $PROG001 + "`n"
$body = $body + "B002 -> " + $PROG002 + "`n"
$body = $body + "B003 -> " + $PROG003 + "`n"
$body = $body + "B004 -> " + $PROG004 + "`n"
$body = $body + "(再起動メニューログインID=99999)"send-mailmessage `
-to "user1@xxx.co.jp" `
-from "error@xxx.co.jp" `
-subject "常駐ソフト起動確認" `
-body $body `
-SmtpServer "smtp.xxx.co.jp" `
-Encoding ([System.Text.Encoding]::Default)
}- 回答としてマーク 牟田口大介Moderator 2012年6月13日 9:33
すべての返信
-
説明が足りませんでした。
メールの送信方法は分かりますので、プロセスの終了を検出する方法が分かれば助かります。
やりたいことは、
常駐処理が数本動いているのですが、たまにどれかが異常終了してしまいます。
5分に1回スクリプトを起動して、その時に1つでも起動されていなければ
異常通知のメールを、運用者に送信したいのです。
現在は、VBSで検出しているのですが、PowerShellで出来ないものかと。
スクリプトはタイマープログラムで、5分に1回起動させます。
vbsで書いたものはこんな感じです。
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & "server" & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Process",,48)Dim ProcCtr
Dim Chk_PROG001,Chk_PROG002,Chk_PROG003,Chk_PROG004Chk_PROG001="0"
Chk_PROG002="0"
Chk_PROG003="0"
Chk_PROG004="0"ProcCtr = 0
For Each ProcItems In colItems
Select Case ProcItems.Description
Case "PROG001.EXE"
ProcCtr = ProcCtr + 1
Chk_PROG001="1"
Case "PROG002.EXE"
ProcCtr = ProcCtr + 1
Chk_PROG002="1"
Case "PROG003.EXE"
ProcCtr = ProcCtr + 1
Chk_PROG003="1"
Case "PROG004.EXE"
ProcCtr = ProcCtr + 1
Chk_PROG004="1"End Select
Next
If ProcCtr <> 4 Then
Set objEmail = CreateObject("CDO.Message")
objEmail.From = "error@xxx.co.jp"objEmail.To = "user1@xxx.co.jp"
objEmail.Subject = "☆☆☆プログラム確認要求☆☆☆"
objEmail.Textbody = "プログラムが1つ以上停止しています" & Chr(13) & "至急確認してください!" & Chr(13) & Chr(13)
objEmail.Textbody = objEmail.Textbody & "*******************************************" & Chr(13)
objEmail.Textbody = objEmail.Textbody & "* 起動->1 停止->0 *" & Chr(13)
objEmail.Textbody = objEmail.Textbody & "*******************************************" & Chr(13) & Chr(13)
objEmail.Textbody = objEmail.Textbody & "PROG001 ->" & Chk_PROG001 & Chr(13)
objEmail.Textbody = objEmail.Textbody & "PROG002 ->" & Chk_PROG002 & Chr(13)
objEmail.Textbody = objEmail.Textbody & "PROG003 ->" & Chk_PROG003 & Chr(13)
objEmail.Textbody = objEmail.Textbody & "PROG004 ->" & Chk_PROG004 & Chr(13)objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.xxx.co.jp"
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objEmail.Configuration.Fields.Update
objEmail.Send
End If説明不足を補えているでしょうか?
-
ありがとうございました。
なんとか自己解決しました。
お手数をお掛けしてすみません。
こんな風になりました。
$lst = get-process -name "PROG*" | SELECT-OBJECT NAME
$ctr=0
foreach ($value in $lst)
{
$PROG001 = "X"
$PROG002 = "X"
$PROG003 = "X"
$PROG004 = "X"switch -r ($value)
{
"PROG001" { $ctr += 1 }
"PROG001" { $PROG001 = "O"}
"PROG002" { $ctr += 1 }
"PROG002" { $PROG002 = "O"}
"PROG003" { $ctr += 1 }
"PROG003" { $PROG003 = "O"}
"PROG004" { $ctr += 1 }
"PROG004" { $PROG004 = "O"}
}
}if ($ctr -ne 9)
{
$date = get-date
$body = "$date `n"
$body = $bofdy + "常駐ソフトが終了しました。`n"
$body = $body + "*******************************************`n"
$body = $body + "* 停止=X *`n"
$body = $body + "*******************************************`n"
$body = $body + "B001 -> " + $PROG001 + "`n"
$body = $body + "B002 -> " + $PROG002 + "`n"
$body = $body + "B003 -> " + $PROG003 + "`n"
$body = $body + "B004 -> " + $PROG004 + "`n"
$body = $body + "(再起動メニューログインID=99999)"send-mailmessage `
-to "user1@xxx.co.jp" `
-from "error@xxx.co.jp" `
-subject "常駐ソフト起動確認" `
-body $body `
-SmtpServer "smtp.xxx.co.jp" `
-Encoding ([System.Text.Encoding]::Default)
}- 回答としてマーク 牟田口大介Moderator 2012年6月13日 9:33