自動サービスが開始されていない場合の電子メール通知 (Windows Server 2012 R2)

自動サービスが開始されていない場合の電子メール通知 (Windows Server 2012 R2)

私たちの環境には、更新プログラムを自動的にインストールし、その後再起動するサーバー (Windows Server 2012 R2) がいくつかあります。

再起動後、自動開始に設定されているすべての (Windows) サービスのステータスを確認します。サービスが開始されなかった場合、スクリプトはサービスの起動を 3 回試行し、すべての試行が失敗した場合は、このサーバー上のこのサービスに何が問題なのかを確認できるように、電子メール通知を送信する必要があります。

簡単な解決策、たとえば PowerShell スクリプトがすでに存在しているかどうか疑問に思っていました。

答え1

NMS の導入を検討することをお勧めします。当社では PRTG を使用していますが、問題なく動作しています。PRTG では、WMI を使用して Windows サービスを監視するセンサーを作成できます。サービスがダウンした場合にメールを送信したりスクリプトを開始したりするようにセンサーを構成できます。

PRTG はセンサーごとにライセンスされますが、無料版では 100 個のセンサーが提供され、数台のサーバーには十分なはずです (監視するサービスごとに 1 つのセンサーが必要です)

答え2

Powershell は、これらのサービスを監視するのに非常に便利です。奇妙なことに、私はちょうど今日、これに関するブログを読んでいました。スクリプトが見つかったらリンクを貼ってみますが、大まかな概要は次のとおりです。

1.) 自動的に開始するように設定されているサービスを見つけます。

2.) サービスの状態を確認します。

問題は、

get-service

コマンドレットはいかなる種類の「StartupType」も出力しないため、代わりに Win32_Service WMI オブジェクトを使用する必要があります。

Foreach($Server in $ServerList){
    Get-WmiObject -ComputerName $Server Win32_Service | 
    Where-Object {$_.StartMode -eq 'Auto' -AND $_.State -eq 'Stopped'}
}

これにより、希望するパラメータに適合するサービスのリストが表示されます。

ノート これにはいくつか注意点があります:

1.) $_.StartMode -eq 'Auto' は、起動後すぐに開始するように設定されているサービスと、遅延後に自動的に開始するように設定されているサービスの両方を網羅するため、サーバーの起動後数分でこのスクリプトを開始することを強くお勧めします。

2.) このワンライナーを通じて返されるサービスの中には、おそらく監視する必要のないサービスがあります。(つまり、私のラップトップでは、「TrustedInstaller」というサービスがこの基準に適合し、停止したサービスとして返されました :/ ) そのため、これらもフィルター処理する必要がある可能性が高くなります。

答え3

サービス > プロパティ > 回復

ここに画像の説明を入力してください

最初の 3 回の失敗時に、サービスの再起動やコマンドの実行など、実行する操作を選択できます。

ここでも使用しますプログラムを実行するサービスの再起動、ファイルのクリア、通知の送信などを行うスクリプトを設定します。私は NMS (Zabbix) または Powershell スクリプトを全面的に支持していますが、そのほとんどはネイティブで解決でき、GPO (環境に該当する場合) で必要なすべてのサービス/マシンにわたってこれを設定することができます。

答え4

自分にぴったりのPowershellスクリプトを見つけました。少しカスタマイズするだけです。こちらがリンクです。http://doitcloudy.blogspot.de/2014/07/scriptgesteuerter-neustart-von-windows.html(ドイツ語ですが、ページの下部にあるスクリプトはすべて英語です)。ただし、この部分 (130 行目以降) については助けが必要です。

foreach ($item in $report){
Write-Host "Starting Service " $item.Name " on server: " $item.Server -Foregroundcolor yellow
$start = Get-Date
$startSVCblock = {param($item) Start-Service -InputObject (Get-Service -ComputerName $item.Server -Name $item.Name)}
$j = Start-Job -ScriptBlock $startSVCblock -Arg $item
do {
    if ($j.State -ne 'Running') { break} 
    $j | Receive-Job
} while (((Get-Date) - $start) -le $timeout)

}

これはスクリプトがサービスを開始する部分だとわかりますが、Powershell のジョブに慣れていません。サービスの開始に失敗したときにサービス名をログ ファイルに書き込むようにスクリプトを編集するにはどうすればよいでしょうか? try/catch を使用すればよいでしょうか?

編集:

もし誰かがこれに遭遇し、私がどのように解決したかを知りたいなら、多くの調査の結果、Receive-Job の出力をログ ファイルに書き込むのは非常に難しいことがわかりました。そこで、別のアプローチを選択しました。ジョブの終了後にサーバーが実行中かどうかを確認します。コードは次のとおりです。

foreach ($item in $report){
Write-Output "Starting Service " $item.Name " on server: " $item.Server
$start = Get-Date
$startSVCblock = {param($item) Start-Service -InputObject (Get-Service -ComputerName $item.Server -Name $item.Name)}
$j = Start-Job -ScriptBlock $startSVCblock -Arg $item
do {
    if ($j.State -ne 'Running') { break} 
    $j | Receive-Job
} while (((Get-Date) - $start) -le $timeout)
$newService = Get-Service -ComputerName $item.Server -Name $item.Name
if ($newService.Status -ne "Running") { LogWrite "$item could not start" }

}

関連情報