Rubrik: System/Windows · Computer/Benutzer/Ländereinstellungen | VB-Versionen: VB4, VB5, VB6 | 06.01.03 |
Mit welchen Rechten ist ein User angemeldet? Dieses Beispiel zeigt, ob ein User als Admin, Benutzer mit eingeschränkten Rechten oder als Gast angemeldet ist. | ||
Autor: Dieter Otter | Bewertung: | Views: 18.091 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Der nachfolgende Code zeigt, ob ein User im System als Admin, Benutzer mit eingeschränkten Rechten oder als Gast angemeldet ist. Die Funktion User_LogInState liefert hierbei als Rückgabewert eine der vordefinierten KONSTANTEN zurück. Die Abfrage funktioniert allerdings nur auf WinNT-Systemen, also WinNT, Win2000 und WinXP. Unter Win9x würde es beim Aufruf der NetUserGetInfo-Funktion zu einem Fehler kommen. Diesen Fehler umgehen wir insofern, indem wir vor dem Aufruf einfach das Betriebssystem ermitteln. Handelt es sich um ein Win9x-System geben wir als Rückgabewert "ADMIN" zurück.
Kopieren Sie nachfolgenden Code bitte in ein MODUL:
Option Explicit ' API's zum Ermitteln des Betriebssystems 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 Declare Function GetVersionEx Lib "kernel32" _ Alias "GetVersionExA" ( _ ByRef lpVersionInformation As OSVERSIONINFO) As Long Private Const VER_PLATFORM_WIN32_NT = 2 ' API's zum Ermitteln der User-Infos Private Declare Function NetUserGetInfo Lib "Netapi32.dll" ( _ lpServer As Any, _ UserName As Byte, _ ByVal Level As Long, _ lpBuffer As Long) As Long Private Declare Function NetApiBufferFree Lib "Netapi32.dll" ( _ ByVal lpBuffer As Long) As Long Public Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" ( _ Destination As Any, _ Source As Any, _ ByVal Length As Long) ' aktueller Benutzer Private Declare Function GetUserName Lib "advapi32.dll" _ Alias "GetUserNameA" ( _ ByVal lpBuffer As String, _ nSize As Long) As Long ' UserInfo-Struktur Private Type USER_INFO_1 usri1_name As Long usri1_password As Long usri1_password_age As Long usri1_priv As Long usri1_home_dir As Long usri1_comment As Long usri1_flags As Long usri1_script_path As Long End Type ' UserStatus Public Enum USER_PRIV USER_PRIV_GUEST = 0 USER_PRIV_USER = 1 USER_PRIV_ADMIN = 2 End Enum
' Hilfsfunktion: ' Windows NT-System? (NT, 2K, XP) Public Function IsWinNT() As Boolean Dim OSVersion As OSVERSIONINFO With OSVersion .dwOSVersionInfoSize = Len(OSVersion) GetVersionEx OSVersion IsWinNT = (.dwPlatformID = VER_PLATFORM_WIN32_NT) End With End Function
' Hilfsfunktion: ' Ermittelt den Namen des aktuell ' angemeldeten Benutzers Public Function GetUser() As String Dim UserName As String Dim Result As Long UserName = Space$(256) Result = GetUserName(UserName, Len(UserName)) If InStr(UserName, Chr$(0)) > 0 Then _ UserName = Left$(UserName, InStr(UserName, Chr$(0)) - 1) GetUser = UserName End Function
' Prüft, mit welchen Rechten ein User im System ' angemeldet ist ' ' Wenn kein Username angegeben wird, wird der ' Login-Status für den aktuell angemeldeten User ' ermittelt ' ' Rückgabewert: USER_PRIV_GUEST : Gast ' USER_PRIV_USER : Eingeschränkte Rechte ' USER_PRIV_ADMIN : Administrative Rechte ' ' Hinweis: Auf Win9x-Systemen wird IMMER USER_PRIV_ADMIN ' zurückgegeben! ' Public Function User_LogInState( _ Optional ByVal sUserName As String = "") As USER_PRIV Dim nResult As Long Dim nBuffer As Long Dim UserInfo As USER_INFO_1 Dim bServer() As Byte Dim bUser() As Byte ' NT-System? If Not IsWinNT() Then ' Nein, dann immer ADMIN-Rechte! User_LogInState = USER_PRIV_ADMIN Else ' Computer und UserName in Byte-Array umwandeln If sUserName = "" Then sUserName = GetUser() bServer = "" & vbNullChar bUser = sUserName & vbNullChar ' UserInfo "holen" nResult = NetUserGetInfo( _ bServer(0), bUser(0), &H1, nBuffer) If nResult = 0 Then ' Daten in InfoStruktur kopieren CopyMemory UserInfo, ByVal nBuffer, Len(UserInfo) NetApiBufferFree nBuffer ' Benutzer-Rechte auswerten User_LogInState = UserInfo.usri1_priv End If End If End Function
Beispiel für den Aufruf:
Dim nState As USER_PRIV nState = User_LogInState() MsgBox "Sie sind aktuell angemeldet als: " & _ Choose(nState + 1, "Gast", _ "Benutzer (eingeschränkte Rechte)", _ "Admin"), _ vbInformation