Auf einigen Systemen kommt ausschließlich Access zum Einsatz und die Anwender sollen möglichst gar nicht auf die Idee kommen, mit anderen Programmen zu arbeiten oder gar mit den Einstellungen des Betriebssystems zu experimentieren.
Der automatische Start von Access beim Einschalten des Rechners ist kein Problem, aber wie können Sie das System „sauber“ herunterfahren?
Oder wie gehen Sie vor, wenn Sie kurz vor Feierabend eine komplexe Auswertung bzw. einen umfangreichen Import vor gang starten? Der Rechner soll nach Beendigung der Aufgabe (und wirklich erst dann) automatisch heruntergefahren werden.
Wir haben die Lösung für Sie:
Der Maus klick auf eine Formularschaltfläche oder ein Funktionsaufruf genügen, um nicht nur Access, sondern auch Windows komplett zu verlassen. Falls das von Ihnen eingesetzte System Power-Management-Funktionen unterstützt, brauchen Sie dann nicht einmal mehr den Aus-Schalter zu betätigen.
Der Programmcode der Beispiellösung greift auf API-Funktionen zurück – also auf Funktionen, die direkt von Windows bereitgestellt werden. Deshalb haben Sie wie beim manuellen Beenden des Systems die Möglichkeit, den Rechner komplett herunterzufahren, ihn neu zu starten oder sich einfach nur abzumelden. Sie kennen die Befehle aus dem Startmenü von Windows.
Um die verschiedenen Optionen vorzustellen, enthält die mitgelieferte Beispieldatenbank ein Formular mit entsprechenden Optionsfeldern. So können Sie die gewünschte Shutdown-Methode auswählen und anschließend testen, wie sich Ihr System verhält. Das hilft bei der Entscheidung, welches Verfahren am besten für Ihre eigenen Access-Lösungen geeignet ist.
Installieren Sie die Datenbank und öffnen sie. Zum Experimentieren dient das Formular „frmExitWin“.
Wenn Sie das Formular öffnen, können Sie aus drei Methoden zum Beenden von Windows auswählen: ABMELDEN, NEU STARTEN und HERUNTERFAHREN.
Standard mäßig ist die letzte Option aktiviert. Nachdem Sie sich für eine der drei Varianten entschieden haben, klicken Sie auf die darunter stehende Symbolschaltfläche.
Um ein versehentliches Herunterfahren zu vermeiden, erscheint zuerst eine Sicherheitsabfrage. Nur wenn Sie diese Abfrage mit JA bestätigen, wird die aktuelle Windows-Sitzung tatsächlich beendet. Je nach vorheriger Auswahl erfolgt automatisch eine Neuanmeldung, ein Neustart oder der Rechner wird komplett ausgeschaltet.
Wenn Sie mehr über die Funktionsweise der Beispiellösung wissen wollen, öffnen Sie das Formular „frmExitWin“ im Entwurfsmodus. Lassen Sie sich dann mit ANSICHTCODE bzw. ENTWURF-TOOLS-CODE ANZEIGEN das Fenster mit den dazugehörigen VBA-Anweisungen anzeigen.
Das Codefenster des Formulars enthält lediglich die Ereignisprozedur, die beim Anklicken der Befehlsschaltfläche ausgeführt wird. Kern ist der Aufruf der Hauptprozedur „ComputerShutdown“; die restlichen Codezeilen dienen nur zur Verarbeitung eventueller Fehler.
Beachten Sie, dass der Hauptprozedur der aktuelle Wert der Optionsgruppe „fraExitOptions“ übergeben wird. Der Wert 1 entspricht der Auswahl ABMELDEN, der Wert 2 der Option NEU STARTEN und der Wert 3 gehört zu HERUNTERFAHREN.
Wenn Sie einen genaueren Blick auf die Hauptprozedur „ComputerShutdown“ werfen wollen, öffnen Sie das Modul „modShutdownFunctions“.
In Access 97 müssen Sie dazu im Datenbankfenster auf das Register MODULE wechseln. In den anderen Access-Versionen können Sie im Visual-Basic-Editor direkt zum entsprechenden Modulfenster gehen.
Vor der eigentlichen Prozedur werden einige API-Funktionen und die dafür erforderlichen Konstanten sowie Typklassen deklariert.
Zum Beenden von Windows benötigen Sie im Prinzip nur folgende API-Bestandteile:
Private Const EWX_LOGOFF = 0
Private Const EWX_SHUTDOWN = 1
Private Const EWX_REBOOT = 2
Private Const EWX_FORCE = 4
Private Declare Function ExitWindowsEx _
Lib „user32“ _
(ByVal uFlags As Long, _
ByVal dwReserved As Long) _
As Long
Diesem theoretisch einfachen Ansatz machen jedoch die Windows-Versionen, die auf Netzwerk- und Mehrbenutzerumgebungen spezialisiert sind, einen Strich durch die Rechnung.
Die Sicherheitseinstellungen (Zugriffsprivilegien) in Windows NT, 2000, XP und Vista verhindern, dass die API-Funktion „ExitWindowsEx“ aus Access heraus aufgeführt werden kann.
Das bedeutet, dass Sie weitere API-Funktionen benötigen, mit denen Sie die Windows-Version abfragen und neue Zugriffsrechte verteilen können.
Zum Einsatz kommen die Betriebssystemfunktionen in der Prozedur „Computer-Shutdown“. Sofern das Herunterfahren des Systems in der „MsgBox“-Funktion bestätigt worden ist, fragen Sie mit „GetVersionEx“ die Details der aktuellen Windows-Version ab. Im Parameter „dwPlatformId“ steht entweder der Wert 1 für Windows 95/98/ME oder der Wert 2 für Windows NT/2000/XP/Vista. Davon ausgehend entscheiden Sie, ob spezielle Zugriffsprivilegien geändert werden müssen oder nicht.
Das äußert sich im Code wie folgt:
WinInfo.dwOSVersionInfoSize = Len(WinInfo)
GetVersionEx WinInfo
‚dwPlatformID für Win95/98/ME ist 1, für WinNT/2000/XP ist es 2
If WinInfo.dwPlatformId = VER_PLATFORM_WIN32_NT Then
hProcess = GetCurrentProcess()
OpenProcessToken hProcess, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken
LookupPrivilegeValue „“, „SeShutdownPrivilege“, LocalLUID
LocalPriv.PrivilegeCount = 1
LocalPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
LocalPriv.Privileges(0).pLuid = LocalLUID
AdjustTokenPrivileges hToken, False, LocalPriv, Len(NewPriv), NewPriv, lBuffer
End If
Zum Setzen neuer Privilegien benötigen Sie zuerst ein Handle zum aktuellen Prozess – also zur laufenden Access-Anwendung.
Dann fragen Sie die Sicherheits-Tokens ab und ermitteln die Shutdown-Berechtigung.
Schließlich definieren Sie die Berechtigung um und weisen sie dem Sicherheits-Token des Prozesses zu.
Die darauf folgende Select-Case-Verzweigung widmet sich bereits den Einstellungen, die für den allgemeinen Shutdown-Vorgang relevant sind.
Spezielle Flags sind für das Abmelden, Neustarten oder Herunterfahren zuständig.
Der Wert richtet sich nach dem Parameter, den Sie der Prozedur übergeben hatten.
Und zum Schluss beenden Sie das System mit der API-Funktion „ExitWindows Ex“.
Select Case ShutdownMode
Case 1 ‚Logoff
lFlags = EWX_LOGOFF + EWX_FORCE
Case 2 ‚Neu starten
lFlags = EWX_REBOOT + EWX_FORCE
Case 3 ‚Herunterfahren
lFlags = EWX_SHUTDOWN + EWX_FORCE
Case Else
lFlags = EWX_SHUTDOWN + EWX_FORCE
End Select
ExitWindowsEx lFlags, 0
Unser Tipp:
Beachten Sie, dass jeweils die Konstante „EWX_FORCE“ addiert wird. Das ist nicht zwingend erforderlich, hat aber den Vorteil, dass Windows auch dann beendet wird, wenn eine Anwendung aus irgendwelchen Gründen nicht reagiert.
Normalerweise erscheint in diesem Fall ein Hinweisfenster auf dem Bildschirm, was das Herunterfahren des Systems unterbrechen würde. Die Hauptprozedur und, wenn Sie wollen, auch das Formular lassen sich problemlos in Ihre eigenen Datenbanken einbinden.
Am einfachsten ist es, sowohl das Formular als auch das Modul aus der Beispieldatenbank in Ihre Datenbank zu importieren.
Dazu verwenden Sie bis Access 2003 den Befehl DATEI-EXTERNE DATEN-IMPORTIEREN. In Access 2007 wechseln Sie in der Multifunktionsleiste auf die Registerkarte „Externe Daten“ und klicken in der Gruppe „Importieren“ auf die Schaltfläche ACCESS.
Sobald das Formular „frmExitWin“ und das Modul „modShutdownFunctions“ in die Zieldatenbank integriert sind, müssen Sie nur noch eine Formularschaltfläche oder einen Menübefehl einrichten, die/der das Formular öffnet. Die restliche Funktionsweise kennen Sie aus der hier vorgestellten Beispiellösung.
Ebenso gut ist es natürlich möglich, nur das Modul in Ihre Datenbank zu übernehmen. Vielleicht wollen Sie sogar auf die Auswahl verschiedener Shutdown-Methoden verzichten und allein das Herunterfahren aktivieren.
In diesem Fall brauchen Sie nur das Modul „modShutdownFunctions“ zu importieren. Danach schreiben Sie einen VBA-Programmcode, der die Prozedur „ComputerShutdown“ mit dem gewünschten Parameter aufruft. Oder Sie gehen einen Schritt weiter und bearbeiten die Hauptprozedur, indem Sie den Parameter und die SelectCase-Anweisung löschen.
Anschließend stellen Sie das Flag für die API-Funktion generell auf einen der Werte „EWX_LOGOFF“, „EWX_REBOOT“ oder „EWX_SHUTDOWN“ ein.
In jedem Fall wird es in Zukunft kein Problem mehr sein, das System „sauber“ zu beenden.
Module: modShutdownFunctions