Rubrik: System/Windows · Computer/Benutzer/Ländereinstellungen | VB-Versionen: VB5, VB6 | 26.03.07 |
Informationen über einen Benutzer Mit Hilfe der API-Funktion NetUserGetInfo lassen sich einige interessante Informationen über einen bestimmten Benutzer in Erfahrung bringen. | ||
Autor: Hawker | Bewertung: | Views: 10.526 |
ohne Homepage | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Manchmal ist es interessant, etwas mehr über einen Benutzer zu erfahren. Um Informationen über einen Benutzer zu erhalten, bietet Windows die NetUserGetInfo-API an. In Verbindung mit einer USER_INFO-Struktur kann man sehr umfangreiche Informationen einholen. Der Zugriff auf einige der in USER_INFO_3 angeführten Infos wird jedoch von Windows geblockt (z.B. das Passwort). Bei einem solchen Aufruf wird (bei einer Umwandlung von Unicode zu VB-String) sofort die gesamte VB-EXE geschlossen. Es empfiehlt sich also, das Programm rechtzeitig zu speichern! In nachfolgendem Beispielcode sind nur einige Beispielaufrufe angeführt. Dabei ist stets auf den Rückgabewert zu achten. Einige Type-Eigenschaften liefern einen Rückgabewert vom Typ String und müssen dementsprechend umgewandelt werden (da anfangs noch Unicode!), in diesem Beispiel der volle Name des Benutzers. Bei LastLogon und LastLogoff ist der Rückgabewert ein Long-Integer, und zwar die Anzahl der Sekunden seit dem 01.01.1970 00:00:00 GMT, die man am besten mit DateAdd zu dem genannten Datum hinzufügt.
Fügen Sie nachfolgenden Code in den Codeteil der Form:
Option Explicit ' Benötigte API-Deklarationen Private Const SUCCESS As Long = 0& Private Type USER_INFO_3 usri3_name As Long usri3_password As Long usri3_password_age As Long usri3_priv As Long usri3_home_dir As Long usri3_comment As Long usri3_flags As Long usri3_script_path As Long usri3_auth_flags As Long usri3_full_name As Long usri3_usr_comment As Long usri3_parms As Long usri3_workstations As Long usri3_last_logon As Long usri3_last_logoff As Long usri3_acct_expires As Long usri3_max_storage As Long usri3_units_per_week As Long usri3_logon_hours As Long usri3_bad_pw_count As Long usri3_num_logons As Long usri3_logon_server As Long usri3_country_code As Long usri3_code_page As Long usri3_user_id As Long usri3_primary_group_id As Long usri3_profile As Long usri3_home_dir_drive As Long usri3_password_expired As Long End Type Private Declare Function NetUserGetInfo Lib "Netapi32.dll" ( _ ServerName As Any, _ UserName As Any, _ ByVal Level As Long, _ Buffer As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" ( _ Dest As Any, _ ByVal Source As Long, _ ByVal cbCopy As Long) Private Declare Function NetApiBufferFree Lib "Netapi32.dll" ( _ ByVal lpBuffer As Long) As Long ' in diesen Variablen werden die Benutzer-Infos gespeichert Dim LastLogon, LastLogoff, NumLogons, Expire, PWAge, Priv, FullName As String
' Informationen über einen Benutzer ermitteln Private Function Userinfo(ByVal Server As String, ByVal User As String) As Boolean Dim buff As Long Dim bServer() As Byte Dim bUser() As Byte Dim ui3 As USER_INFO_3 Dim sByte() As Byte ReDim sByte(255) ' vbNull anhängen bUser = User & vbNullChar bServer = Server & vbNullChar ' Infos holen If NetUserGetInfo(bServer(0), bUser(0), 3, buff) = SUCCESS Then ' in USER_INFO_3 Struktur kopieren CopyMemory ui3, ByVal buff, Len(ui3) ' Letzte Anmeldung (GMT!!!) If ui3.usri3_last_logon > 0 Then LastLogon = DateAdd("s", (ui3.usri3_last_logon), "1-Jan-70") Else LastLogon = "" End If ' Anzahl aller Anmeldungen NumLogons = ui3.usri3_num_logons ' Letzte Abmeldung (Rückgabewert oft Null) (GMT!) If ui3.usri3_last_logoff > 0 Then LastLogoff = DateAdd("s", (ui3.usri3_last_logoff), "1-Jan-70") Else LastLogoff = "" End If ' Verfall: -1 = account verfällt nie, ansonsten sec ab 1. Jan 1970 Expire = ui3.usri3_acct_expires ' Alter das Passworts in sec PWAge = Round((ui3.usri3_password_age / 84600), 3) ' Privilegien: 0 = Gast, 1 = Benutzer, 2 = Administrator Priv = ui3.usri3_priv ' Voller Name CopyMemory sByte(0), ui3.usri3_full_name, 256 FullName = sByte If InStr(FullName, Chr$(0)) > 0 Then FullName = Left$(FullName, InStr(FullName, Chr$(0)) - 1) End If Userinfo = True Else Userinfo = False End If NetApiBufferFree buff End Function
Per Schaltflächen-Klick soll die Benutzerinfos des aktuell angemeldeten Benutzer angezeigt werden:
Private Sub Command1_Click() ' Benutzerinformationen ermitteln Screen.MousePointer = 11 If Userinfo("", Environ$("USERNAME")) Then MsgBox "FullName: " & IIf(Len(FullName) > 0, FullName, "-") & vbCrLf & _ "Last Logon: " & LastLogon & vbCrLf & _ "Last Lofoff: " & LastLogoff & vbCrLf & _ "Number Logons: " & NumLogons & vbCrLf & _ "PW Expires: " & Expire & vbCrLf & _ "PW Age: " & PWAge & vbCrLf & _ "Privilege: " & Priv Else MsgBox "Konnte keine Infos zu dem angegebenen Benutzer ermitteln!" End If Screen.MousePointer = 0 End Sub