WindowsXP und globales Energieschema

September 7th, 2006

Bei der Konfiguration eines neuen Rechners für mehrere Benutzer bin ich mal wieder auf Hindernisse gestoßen. Folgender Wunsch:
Der Rechner soll nachts das Energieschema wechseln und somit in den StandBy-Betrieb wechseln. Tagsüber soll er das aber nicht tun.

Generell war ich nach einiger Recherche überrascht, dass es ein Commandline-Tool powercfg.exe gibt, welches Energieschemen bearbeiten, erstellen, löschen und natürlich wechseln kann. Zur Realisierung dieses Vorhabens werden mit dem Administratorkonto (nicht die normalen Benutzer oder einer mit Adminrechten) die Energieschemen definiert.
Normale (eingeschränkte) Benutzer dürfen im laufenden Betrieb nicht das Energieschema wechseln. Verwirrender Weise werden dem Nutzer nicht die globalen und das aktive Schema angezeigt. Nach einigem Rumprobieren habe ich festgestellt, dass man die Anzeige getrost ignorieren kann. Allerdings kommen sich weitere Benutzer mit Adminrechten in die Quere. Sobald ein Admin eingeloggt ist, überschreibt dieser das globale Energieschema. Sehr dumm, aber mal wieder typisch. Die Lösung findet sich in der Registry unter HKEY_LOCAL_MACHINE \SOFTWARE \Microsoft \Windows \CurrentVersion \Controls Folder \PowerCfg \GlobalPowerPolicy, dort wird das globale Energieschema festgelegt. Verbietet man nun dort jedem Benutzer mit Administratorrechten expliziert den Vollzugriff, kann dieser das globale Energieschema nicht mehr ändern und wir hätten schon mal eine Hürde gemeistert.

Um den automatischen Wechsel des Energieschemas zu realisieren, wird ein automatischer Task (bei jedem Hochfahren) eingerichtet, der folgendes Script aufruft:
var AlwaysOnBegin=9;
var AlwaysOnEnd=23;

while(true)
{
var curTime=new Date();
var curHour=curTime.getHours();
var WshShell = WScript.CreateObject("WScript.Shell")
if (curHour>=AlwaysOnBegin && curHour< =AlwaysOnEnd)
{
WshShell.Exec("powercfg /SETACTIVE AlwaysOn");
WshShell.Exec("eventcreate /l system /t INFORMATION /id 100 /SO PowerSaving /D \"Switched PowerScheme to AlwaysOn\"");
}
else
{
WshShell.Exec("powercfg /SETACTIVE OverNight");
WshShell.Exec("eventcreate /l system /t INFORMATION /id 100 /SO PowerSaving /D \"Switched PowerScheme to OverNight\"");
}
WScript.Sleep(1800000);
}

Das Skript läuft also rund um die Uhr und zwischen 9 und 23 Uhr wird auf das Energieschema “AlwaysOn” gewechselt. Ausserhalb dieser Zeit wird auf “OverNight”-Betrieb gewechselt. Am Ende schläft das Skript 30 Minuten und fängt wieder von vorn an. Nach jedem Aufruf des Energieschemas wird ein Ereignis in das Ereignisprotokoll geschrieben, so dass man immer schauen kann, ob das Skript ordnungsgemäß die Modi wechselt. Das Tool eventcreate.exe ist allerdings nur ab WinXP Professional verfügbar. Unter XP Home muss man darauf leider verzichten.

Einen störenden Aspekt hat das ganze allerdings: Es läuft permanent das Skript im Hintergrund. Gut, es stört nicht wirklich, aber anfänglich hatte ich gehofft, das Script über Events aufzurufen. Leider war es mir in VBScript nicht möglich Wakeup-Events oder Logon-Events aufzufangen. Das wäre wohl mit einem eigenen selbstgeschriebenen Programm möglich gewesen, aber das Javascript macht ja seinen Job. Falls jemand doch eine Ahnung haben sollte, wie ich Windows dazu bringe, beim (Re-)Logon von Benutzern und/oder beim Wakeup eine Aktion ausführen zu lassen, bitte bei mir melden!! ;-)

Leave a Reply


Impressum
Creative Commons License
© 2005-2008 Andreas Groll