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
Freiberuflicher IT Berater, Open Source Entwickler und begeisterter Smarthome Nutzer. Das hier ist mein Braindump für Technikthemen, die mich beschäftigen.