RSS
StartseiteKnowledge LibraryTop 10Impressum

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