Wie kann ich den aktuellen Benutzer SID in VB6 bekommen?
-
22-09-2019 - |
Frage
ich einige alte Code haben, dass wir in VB6 zu halten haben. Wir müssen die Fähigkeit hinzuzufügen, um es den aktuellen Benutzers SID nachzuschlagen. Kann mir jemand Punkt auf einige Code, der zeigt, wie das zu tun? Vielen Dank im Voraus für Ihre Hilfe!
Lösung
Versuchen Sie diese
Option Explicit
'--- for OpenProcessToken
Private Const TOKEN_READ As Long = &H20008
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pTo As Any, uFrom As Any, ByVal lSize As Long)
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function GetTokenInformation Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal TokenInformationClass As Long, TokenInformation As Any, ByVal TokenInformationLength As Long, ReturnLength As Long) As Long
Private Declare Function ConvertSidToStringSid Lib "advapi32.dll" Alias "ConvertSidToStringSidA" (ByVal lpSid As Long, lpString As Long) As Long
Private Declare Function LocalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
Public Function GetCurrentUserSid() As String
Dim hProcessID As Long
Dim hToken As Long
Dim lNeeded As Long
Dim baBuffer() As Byte
Dim sBuffer As String
Dim lpSid As Long
Dim lpString As Long
hProcessID = GetCurrentProcess()
If hProcessID <> 0 Then
If OpenProcessToken(hProcessID, TOKEN_READ, hToken) = 1 Then
Call GetTokenInformation(hToken, 1, ByVal 0, 0, lNeeded)
ReDim baBuffer(0 To lNeeded)
'--- enum TokenInformationClass { TokenUser = 1, TokenGroups = 2, ... }
If GetTokenInformation(hToken, 1, baBuffer(0), UBound(baBuffer), lNeeded) = 1 Then
Call CopyMemory(lpSid, baBuffer(0), 4)
If ConvertSidToStringSid(lpSid, lpString) Then
sBuffer = Space(lstrlen(lpString))
Call CopyMemory(ByVal sBuffer, ByVal lpString, Len(sBuffer))
Call LocalFree(lpString)
GetCurrentUserSid = sBuffer
End If
End If
Call CloseHandle(hToken)
End If
Call CloseHandle(hProcessID)
End If
End Function
Andere Tipps
Versuchen Sie, diese Funktion zu implementieren:
Declare Function LookupAccountSid Lib "advapi32.dll" _
Alias "LookupAccountSidA" (ByVal lpSystemName As String, _
ByVal Sid As Long, ByVal Name As String, cbName As Long, _
ByVal ReferencedDomainName As String, _
cbReferencedDomainName As Long, peUse As Integer) As Long
Hier ist ein Link es umgesetzt werden.
Ein wenig von der MSDN-Cruising legt nahe, dass die NetUserGetInfo Funktion ist, die Sie suchen ( http://msdn.microsoft.com/en-us/library/aa370654%28VS.85%29.asp x). Und Microsoft hat bereits ein Beispiel für Sie hier geschrieben: http://support.microsoft.com/kb/151774
Hier ist eine Probe aus dem Verwechseln genannt, aber vertrauenswürdig VB NET Website (die VB6 vor Microsoft gewidmet .NET) erfunden
Diese Demo zeigt, wie man Anruf GetCurrentProcess, LookupAccountSid, AllocateAndInitializeSid, Open und GetTokenInformation, um festzustellen, ob der aktuelle Prozess ist, Ausführung unter einem Administrator Konto. Diese Regel bedeutet, dass die Benutzer ein Mitglied der ADMIN-Gruppe, aber unter bestimmten Umständen (z.B. als Dienst ausgeführt oder möglicherweise Spezifizieren eines Prozesses anders als daß zurückgegeben durch GetCurrentProcess), Der Rückgabewert zeigt an, ob die Prozess wird unter einem Konto ausgeführt mit Admin-Rechten. (Beachten Sie das Abbildung sollte sagen: ‚Strom Prozess und nicht als ‚Benutzer‘ zu sein am meisten genau.)