Search code examples
vb6windows-security

How can I get the current user's SID in VB6?


I have some old code that we have to maintain in VB6. We need to add the ability for it to look up the current user's SID. Can anyone point me to some code that shows how to do that? Thanks in advance for your help!


Solution

  • Try this

    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