Einrichten einer APC Smart UPS unter Hyper-V R2

Da der Einsatzzweck hier ein Server ist, auf dem SBS 2008 und Server 2008 ausgeführt wird, sollen die virtuellen Maschinen nicht in den Ruhezustand versetzt, sondern heruntergefahren werden. Das geht wie folgt:

  • Für die jeweiligen VMs im Hyper-V-Manager unter „Automatische Stoppaktion“ Herunterfahren auswählen
  • APC SmartUPS per USB-Kabel an den Hyper-V Server anschließen, wird automatisch als Batterie erkannt
  • Folgendes Script auf den Server kopieren als „c:\scripts\ups_shutdown.vbs“ (Quelle 1 / Quelle 2):

—– Codebox starts here

Set objWMIService = GetObject(„winmgmts:{impersonationLevel=impersonate,(Shutdown)}\\“ & strComputer & „\root\cimv2“)
set batteryColl = objWMIService.ExecQuery(„select * from Win32_Battery“)
set osColl = wmi.ExecQuery(„select * from Win32_OperatingSystem“)

while true
for each battery in batteryColl
battery.Refresh_
if battery.batteryStatus = 1 and battery.EstimatedChargeRemaining = 60 then
for each os in osColl
os.Win32Shutdown 1
next
end if
next
wscript.Sleep 15000
wend

—– Codebox ends here

  • Folgendes Script auf den Server kopieren als „c:\scripts\ups_shutdown.cmd“:

—– Codebox starts here

@echo off
echo %date% %time% – Starting ups_shutdown as %username% >> c:\scripts\ups_shutdown.log
cscript //nologo c:\scripts\ups_shutdown.vbs %1 >> c:\scripts\ups_shutdown.log
echo %date% %time% – Exiting ups_shutdown unexpectedly! >> c:\scripts\ups_shutdown.log

—– Codebox ends here

Bei Belieben kann das Script natürlich angepasst werden.

  • wscript.sleep 15000 sorgt dafür, dass alle 15 Sekunden geprüft wird
  • … .EstimatedChargeRemaining <= 60 … gibt an, dass das System heruntergefahren wird, wenn die Batteriekapazität unter 60% kommt (bei unserer UPS ist das nach ca. 20-30min der Fall, bleibt also noch genug Zeit, um den Server in Ruhe herunterzufahren)
  • os.Win32Shutdown 1 steht für normales Herunterfahren – alternativ möglich:
    • os.Win32Shutdown 0 – Abmelden
    • os.Win32Shutdown 1 – Herunterfahren
    • os.Win32Shutdown 2 – Neustart
    • os.Win32Shutdown 4 – Abmelden trotz  geöffneter Programme
    • os.Win32Shutdown 5 – Herunterfahren trotz  geöffneter Programme
    • os.Win32Shutdown 5 – Neustart trotz  geöffneter Programme
    • os.Win32Shutdown 8 – PC abschalten
    • os.Win32Shutdown 12 – Abschalten trotz  geöffneter Programme

Um auf dem Server von der Commandline aus herauszufinden, wie voll die UPS geladen ist und ob sie gerade lädt oder entlädt, eignet sich folgendes script, welches dann unter „c:\scripts\ups_status.vbs“ gespeichert wird:

—– Codebox starts here

strComputer = „.“
set objWMIService = GetObject(„winmgmts:{impersonationLevel=impersonate}\\“ & strComputer & „\root\cimv2“)
set batteryColl = objWMIService.ExecQuery(„select * from Win32_Battery“)

for each battery in batteryColl
battery.Refresh_
wscript.Echo „Name / Description: “ & battery.Name & “ / “ & battery.Description
wscript.echo „Battery Status (1 = Discharging, 2 = Charging): “ & battery.batteryStatus
wscript.echo „Estimated Charge Remaining (%): “ & battery.EstimatedChargeRemaining
next

—– Codebox ends here

  • Aufrufen kann man es z.B. durch folgende Batchdatei („c:\scripts\ups_status.cmd“):

—– Codebox starts here

@echo off
cscript //nologo c:\scripts\ups_status.vbs %1

—– Codebox ends here

Möchte man nun auch noch eine E-Mail Benachrichtigung im Fall eines stromausfallbedingten Herunterfahrens bekommen, kann man dafür folgendes PowerShell Skript verwenden (Quelle, habe ich selbst noch nicht getestet!):

—– Codebox starts here

# ups_monitor.ps1 loops forever, checking CIM Battery Class every 60 seconds.
# On power failure, it sends status updates each minute via SMTP until shutdown,
# and one email if power is restored before shutdown.

# Initialize Variables
# Shutdown threshold at 50% of remaining UPS capacity
$threshhold = 50
$interval = 60
$OnBattery = 0
$Event = 0

$hostname = hostname

# Create SMTP client
$Server = „smtp.firma.de
$Port = 25
$Client = New-Object System.Net.Mail.SmtpClient $Server, $Port

$Client.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials

$To      = admin@firma.de
$From    = hyperv01@firma.de

# Loop on Battery Query
while (1)
{
$bat = get-wmiobject -class CIM_Battery -namespace „root\CIMV2“
$batstatus = $bat.batterystatus
$batcapacity = $bat.estimatedchargeremaining
$timetoshutdown = $bat.estimatedruntime/2

if ($batstatus -eq 1)
{
$Event = 1
$OnBattery = 1
# „On Battery“

$Subject = „Utility Power Failure: {0} is running On UPS Battery“ -f $hostname
$Body   = „UPS at {0} % remaining capacity, approximately {1} minutes before {2} shutdown.“ -f $batcapacity, $timetoshutdown, $hostname

if ($batcapacity -lt ($threshhold +5) )
{
$Body = „Shutdown imminent at {0} %, with “ -f $threshhold + $Body
}

}

elseif (($batstatus -eq 2) -and ($OnBattery -eq 1))
{
$Event = 1
$OnBattery = 0
# „Power Restored“

$Subject = „Utility Power Restored to {0}.“ -f $hostname
$Body   = „Battery at {0} % capacity. UPS charging… “ -f $batcapacity
}

if ($Event -eq 1) # Create mail message
{
$Event = 0
$Message = New-Object System.Net.Mail.MailMessage $From, $To, $Subject, $Body
$Message.Priority = [System.Net.Mail.MailPriority]::High
try {
$Client.Send($Message)
# „Message sent successfully“
}
catch {
„Exception caught in ups_monitor.ps1“
}
}

sleep $interval
}

—– Codebox ends here

Zuletzt muss noch das jeweilige Skript so eingerichtet werden, dass es automatisch beim Systemstart geladen wird:

  • Start -> mmc.exe -> Datei -> Snap-In hinzufügen/entfernen -> Aufgabenplanung hinzufügen -> Anderer Computer -> NAME_DES_HYPERV_PCS -> OK
  • Aufgabenplanung (NAME_DES_HYPER_V_PCS) -> Aufgabenplanungsbibliothek -> Aufgabe erstellen
  • Name: ups_shutdown-Script laden bzw. ups_monitoring-Script laden
  • Sicherheitsoptionen -> Unabhängig von der Benutzeranmeldung ausführen
  • Trigger -> Neu -> Beim Start -> OK
  • Aktionen -> Neu -> Programm starten -> c:\scripts\ups_shutdown.vbs bzw. c:\scripts\ups_monitoring.ps1 -> OK
  • Bedingungen -> Energie -> Haken bei „Aufgabe nur starten, falls Computer im Netzbetrieb ausgeführt wird“ entfernen
  • Einstellungen -> Haken bei „Aufgabe beenden, falls sie länger ausgeführt wird als: 3 Tage“ entfernen

Wer nicht abtippen / kopieren mag, lädt die Scripte hier: hyperv_ups_scripts.zip

Wenn diese Seite für dich hilfreich war und du dich bei mir bedanken möchtest, dann freue ich mich ganz außerordentlich darüber, wenn du für deinen nächsten Einkauf bei amazon.de über diesen Link gehst. Ich bekomme dann eine kleine Provision, für dich kostet es keinen Cent extra. Wenn du mich lieber anders unterstützen möchtest, findest du hier hier weitere Möglichkeiten.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.