Ist der angemeldete Benutzer ein Administrator?
Die Rechte eines Windows NT/2000 Users gelten auch für VB Programme!
Benutzer, die von den "einfachen" Betriebssystemen Win95/98/ME auf WinNT/2000/XP umsteigen, sehen sich unter Umständen zum ersten Mal mit Benutzerrechten konfrontiert. Denn während unter Win95/98/ME jeder Benutzer alles darf, reglementiert WinNT/2000/XP den normalen Benutzer in seinem Wirkungskreis. So darf er zum Beispiel weder die Systemzeit ändern, noch in den Systemdateien kramen, geschweige denn uneingeschränkt in der Systemregistrierung lesen oder schreiben (Default-Einstellungen angenommen).
Wird NTFS als Dateisystem genutzt, können Benutzer auch hier in ihren Lese- und Schreibrechten eingeschränkt werden. Der einzige Benutzer, der weiterhin "alles" darf, ist der Administrator. Jede gestartete Anwendung unterliegt ebenfalls den Rechten des Benutzers, unter dessen Konto es gestartet/ ausgeführt wird. Daher kann es zum Beispiel für das Setupprogramm von Interesse sein, ob es von einem Administrator ausgeführt, weil sonst einige Einstellungen nicht vorgenommen werden können oder Dateien nicht ersetzt werden können, weil entsprechende Schreibrechte fehlen.
WinNT/2000 bieten keine direkten Funktionen, die angeben, ob der angemeldete Benutzer Administrationsrechte besitzt. Dazu müssen wir schon eine API Funktion missbrauchen, die eigentlich zur Kontrolle von Diensten gedacht ist, die Funktion OpenSCManager. Aber durch ihre eigentliche Aufgabe eignet sie sich bestens, um zuverlässig festzustellen, ob der angemeldete Benutzer ein Administrator ist, denn nur er darf Dienstprogramme konfigurieren.
Die beiden ersten Parameter "lpMachineName" und "lpDatabaseName" sind für die gewünschte Aufgabe nicht von Relevanz, deswegen wird hier "vbNullString" übergeben und die Funktion angewiesen Standardeinstellungen zu verwenden. "dwDesiredAccess" interessiert uns dafür um so mehr, denn hier fordern wir vollen Zugriff, also lesen, schreiben und ausführen. Dieser Vollzugriff steht nur einem Administrator zu. Wird die Anwendung von einem normalen Benutzer ausgeführt, schlägt diese Funktion fehl, da der geforderte Zugriff nicht mit den gegebenen Rechten vereinbar ist.
Erfolg oder Misserfolg äußern sich in der Rückgabe der Funktion. War der Zugriff erfolgreich, liefert OpenSCManager ein Handle auf die Service Control Datenbank und dieser ist immer größer 0. Schlägt die Funktion fehl, wird 0 zurückgegeben.
Zur Arbeitserleichterung, lässt sich das ganze in einer kleinen, handlichen Funktion unterbringen, die uns auch die Überprüfung der verwendeten Plattform abnimmt. Denn die Information, ob der Benutzer Administrationsrechte besitzt oder nicht, ist nur unter Windows NT/2000/XP von Interesse. Unter Win95/98/ME gibt es keine derartigen Sicherheitsvorrichtungen und somit ist jeder Benutzer als "Administrator" anzusehen.
' Deklarationen: Private Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 End Type Private Const WIN_32_WINDOWS = 1 Private Const WIN_32_NT = 2 Private Const GENERIC_EXECUTE = &H20000000 Private Const GENERIC_READ = &H80000000 Private Const GENERIC_WRITE = &H40000000 Private Declare Function OpenSCManager Lib "advapi32.dll" Alias _ "OpenSCManagerA" (_ ByVal lpMachineName As String, _ ByVal lpDatabaseName As String, _ ByVal dwDesiredAccess As Long _ ) As Long Private Declare Function CloseServiceHandle Lib "advapi32.dll" ( _ ByVal hSCObject As Long _ ) As Long Private Declare Function GetVersionEx Lib "kernel32" Alias _ "GetVersionExA" ( _ ByRef lpVersionInformation As OSVERSIONINFO _ ) As Long ' Ermittelt, ob der derzeitig angemeldete Benutzer ein Administrator ist. ' Rückgaben: ' TRUE: Der Benutzer ist ein Administrator ' (Standard Rückgabe unter Win9x/ME) ' FALSE: Der angemeldete Benutzer ist kein Administrator Public Function IsAdmin() As Boolean Dim hSC As Long Dim lRet As Long Dim tOSV As OSVERSIONINFO ' Plattforminfo ermitteln: tOSV.dwOSVersionInfoSize = Len(tOSV) lRet = GetVersionEx(tOSV) If tOSV.dwPlatformId = WIN_32_NT Then ' WinNT/2000: hSC = OpenSCManager(vbNullString, vbNullString, _ GENERIC_READ Or GENERIC_WRITE _ Or GENERIC_EXECUTE) If (hSC <> 0) Then IsAdmin = True ' Service-Handle wieder freigeben: CloseServiceHandle (hSC) End If Else ' Win9x/ME kennen keine Rechtevergabe: IsAdmin = True End If End Function
- IsAdmin - Beispielanwendung (isadmin.zip - 9 KB)