2

APC に同梱されている APC ソフトウェアを使用したくないので、UPS を監視し、バッテリ レベルが 30% に達した場合にサーバーのシャットダウン シーケンスを開始する PowerShell スクリプトを作成しました。

スクリプトは、USB リダイレクトを介して仮想化されたサーバー上で実行されます。ウィンドウは、プライマリ UPS のバッテリ レベルの WMI 入力を監視するため、常に開いたままになります。スクリプトはうまく機能しますが、何度かサーバーにログオンしたところ、画面に次のエラーが表示されました。

Get-WmiObject : Call was canceled by the message filter. (Exception from HRESULT: 0x80010002 (RPC_E_CALL_CANCELED))
At C:\Users\user\Desktop\upsmonitor.ps1:38 char:27
+     $binfo = Get-WMIObject <<<<  -class Win32_Battery -computername $system -namespace root\cimv2
    + CategoryInfo          : InvalidOperation: (:) [Get-WmiObject], COMException
    + FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

これは、WMI アクティビティの一時的な中断が原因であると考えています。これは WMI のクラッシュが原因であるというフォーラムを読んだことがあります。いずれにせよ、これは問題です。スクリプトが機能する必要があり、エラーが発生した場合、何の役にも立たないからです。サーバーを頻繁にチェックするのは理想的ではないので、どちらかの方法が欲しい

  • 失敗時にスクリプトを再実行する
  • 少なくとも、スクリプトが失敗したときに通知する

私はスイッチを読みました-ErrorActionが、私の場合にそれを実装する方法、またはそれが適用可能かどうかさえわかりません。通常、問題を解決できるまでスクリプトをいじってみますが、実際には実稼働環境でのみ発生するようで、一貫性がありません。この問題のトラブルシューティングを行うには、修正が機能することを期待してエラーが発生するのを待つのに数か月かかる可能性があります。

皆さんが提供できる支援をいただければ幸いです。

スクリプトを以下に示します。

## Variable Declaration
cls
$system = "."
$namespace = "root\CIMV2"

#SMTP Variables (for e-mail notifications)
$emailFrom = "ups@domain.com"
$emailto = "me@domain.com"
$subject = "UPS Notifications"
$PSEmailServer = "10.0.0.100"

#Check to see if the event log source exists, and create it if it doesn't
$sourceExists = get-eventlog -list | where-object {$_.logdisplayname -eq "UPS Monitor"}
if (! $sourceExists) {
    new-eventlog -LogName "UPS Monitor" -source "UPS Monitor"
    }

#Send the administrator a message to inform them of monitoring
$initialStatus = Get-WMIObject -class Win32_Battery -computer $system -namespace $namespace
send-mailmessage -From $emailFrom -To $emailTo -Subject $subject -Body "UPS Monitor Online: Monitoring UPS Status."
echo "UPS Monitor Online - Currently Monitoring UPS Status. DO NOT CLOSE THIS WINDOW!"

$eruntime = $initialstatus.estimatedruntime

#What's the status of the Battery upon starting the script
if ($initialStatus.batterystatus -eq 2) {
    echo "Battery Status : On AC Power"
    echo "Estimated Time remaining on charge : $eruntime minutes"
} elseif($initialStatus.batterystatus -eq 1) {
    echo "Battery Status : Discharging"
    echo "Estimated Time remaining on charge : $eruntime minutes"
    }

write-eventlog -logname "UPS Monitor" -Source "UPS Monitor" -EntryType Information -EventID 1 -Message "UPS Monitor Online: Currently Monitoring UPS Status"

while($true)
   {
    $binfo = Get-WMIObject -class Win32_Battery -computername $system -namespace root\cimv2
    if($binfo.BatteryStatus -eq 2) {  
       #On AC Power - No action required
        }
      if($binfo.BatteryStatus -eq 1){
            #If UPS status is 1, UPS is discharging - Notifications will begin at 80% Battery Level
            #echo "Battery Charge Percentage : " $binfo.EstimatedChargeRemaining
             if($binfo.EstimatedChargeRemaining -eq 80){
                #When the battery level gets to 80% write an event to the event log and e-mail the administrator
                write-eventlog -logname "UPS Monitor" -Source "UPS Monitor" -EntryType Information -EventID 1 -Message "Power Failure Detected - 80% Battery Life Remaining"
                send-mailmessage -From $emailFrom -To $emailTo -Subject $subject -Body "Power Failure Detected; Servers on Battery Power. Battery level is 80%"
                start-sleep -seconds 30
                 }
             elseif($binfo.EstimatedChargeRemaining -eq 60){
                #When the battery level gets to 60% write an event to the event log and e-mail the administrator
                write-eventlog -logname "UPS Monitor" -Source "UPS Monitor" -EntryType Information -EventID 1 -Message "Power Failure Detected : 60% Battery Life Remaining"
                send-mailmessage -From $emailFrom -To $emailTo -Subject $subject -Body "Power Failure Detected; Servers on Battery Power. Battery level is 60%"
                start-sleep -seconds 30
                 }
             elseif($binfo.EstimatedChargeRemaining -eq 40){
                #When the battery level gets to 40% write an event to the event log and e-mail the administrator and warn of shutdown
                write-eventlog -logname "UPS Monitor" -Source "UPS Monitor" -EntryType Information -EventID 1 -Message "Power Failure Detected : 40% Battery Life Remaining"
                send-mailmessage -From $emailFrom -To $emailTo -Subject $subject -Body "Power Failure Detected & Reserve battery is critical. Servers will be restarted at 30% battery life if AC power is not resumed"
                start-sleep -seconds 30
                }
              elseif($binfo.EstimatedChargeRemaining -le 30){
                #When the battery level gets to 30% being shutting down servers
                write-eventlog -logname "UPS Monitor" -Source "UPS Monitor" -EntryType Information -EventID 1 -Message "Critical Battery Threshold Reached : Commencing Shutdown of servers"
                send-mailmessage -From $emailFrom -To $emailTo -Subject $subject -Body "Power Failure Detected & Critical Battery Threshold has been Reached. Commencing Shutdown of Servers"
                start-sleep -seconds 15
                stop-computer -cn (Get-Content C:\Users\User\Desktop\serverlist.txt) -Force
                }

        }
    }
4

1 に答える 1