Как я могу получить SID текущего пользователя в VB6?

Обновить

December 2018

Просмотры

3.8k раз

3

У меня есть старый код , который мы должны поддерживать в VB6. Нам нужно добавить возможность для того , чтобы посмотреть на текущем пользователе SID. Может кто - нибудь мне точку в какой - то код , который показывает , как сделать это? Заранее спасибо за помощь!

4 ответы

0

Вот пример из смешения с именем , но заслуживающим доверия VB NET сайта (который был посвящен VB6 , прежде чем Microsoft изобрели .NET)

Этот пример показывает, как вызвать GetCurrentProcess, LookupAccountSid, AllocateAndInitializeSid, OpenProcessToken и GetTokenInformation для того, чтобы определить, является ли текущий процесс выполняется под учетной записью администратора. Как правило, это означает, что пользователь является членом группы администратора, но при определенных обстоятельствах (например, работает как сервис, или, возможно, с указанием способа, отличному возвращаемый GetCurrentProcess), возвращаемое значение указывает, является ли этот процесс в настоящее время работает под учетной записью с правами администратора. (Обратите внимание на иллюстрации следует сказать: «текущий процесс», а не «пользователь», чтобы быть наиболее точным.)

1

Попробуйте реализовать эту функцию:

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

Вот ссылка на его реализацию.

7

Попробуй это

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
wqw
0

Немного крейсерский из MSDN говорит о том , что функция NetUserGetInfo является тот , который вы ищете ( http://msdn.microsoft.com/en-us/library/aa370654%28VS.85%29.asp х). А Microsoft уже написал пример для вас здесь: http://support.microsoft.com/kb/151774