如何获取当前用户';VB6中的SID是什么?

如何获取当前用户';VB6中的SID是什么?,vb6,windows-security,Vb6,Windows Security,我有一些旧代码,我们必须在VB6中维护。我们需要为它添加查找当前用户SID的功能。有人能给我指出一些代码来说明如何做到这一点吗?提前感谢您的帮助 尝试实现此功能: Declare Function LookupAccountSid Lib "advapi32.dll" _ Alias "LookupAccountSidA" (ByVal lpSystemName As String, _ ByVal Sid As Long, ByVal Name As String, c

我有一些旧代码,我们必须在VB6中维护。我们需要为它添加查找当前用户SID的功能。有人能给我指出一些代码来说明如何做到这一点吗?提前感谢您的帮助

尝试实现此功能:

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

下面是一个实现的示例。

稍微浏览一下MSDN,就会发现NetUserGetInfo函数就是您要查找的函数(x)。微软已经在这里为你写了一个例子:

试试这个

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
选项显式
'---对于OpenProcessToken
私有常量令牌\读取长度=&H20008
私有声明子CopyMemory Lib“kernel32”别名“rtlmovemory”(pTo为任意,uFrom为任意,ByVal lSize为Long)
私有声明函数GetCurrentProcess Lib“kernel32”(长度为
私有声明函数CloseHandle Lib“kernel32”(ByVal hObject As Long)为Long
私有声明函数OpenProcessToken库“advapi32.dll”(ByVal ProcessHandle尽可能长,ByVal DesiredAccess尽可能长,TokenHandle尽可能长)尽可能长
私有声明函数GetTokenInformation Lib“advapi32.dll”(ByVal TokenHandle为Long,ByVal TokenInformationClass为Long,TokenInformation为Any,ByVal TokenInformationLength为Long,ReturnLength为Long)为Long
私有声明函数ConvertSidToStringSid Lib“advapi32.dll”别名“ConvertSidToStringSidA”(ByVal lpSid为Long,lpString为Long)为Long
私有声明函数LocalFree Lib“kernel32”(ByVal hMem As Long)为Long
私有声明函数lstrlen Lib“kernel32”别名“lstrlenA”(ByVal lpString As Long)为Long
公共函数GetCurrentUserSid()作为字符串
将hProcessID设置为长
我和你一样长
需要的时间一样长
Dim baBuffer()作为字节
作为字符串的dimsbuffer
暗lpSid与长lpSid相同
将字符串变长
hProcessID=GetCurrentProcess()
如果hProcessID为0,则
如果OpenProcessToken(hProcessID,TOKEN\u READ,hToken)=1,则
调用GetTokenInformation(hToken,1,ByVal 0,0,需要)
ReDim baBuffer(0到需要)
'---枚举TokenInformationClass{TokenUser=1,TokenGroups=2,…}
如果GetTokenInformation(hToken,1,baBuffer(0),UBound(baBuffer),lneed)=1,那么
调用CopyMemory(lpSid、baBuffer(0)、4)
如果ConvertSidToStringSid(lpSid,lpString),则
sBuffer=空格(lstrlen(lpString))
调用CopyMemory(ByVal sBuffer、ByVal lpString、Len(sBuffer))
调用LocalFree(lpString)
GetCurrentUserSid=sBuffer
如果结束
如果结束
呼叫关闭手柄(hToken)
如果结束
调用CloseHandle(hProcessID)
如果结束
端函数
这里来自一个名称混乱但值得信赖的网站(在微软发明.NET之前,该网站致力于VB6)

此演示演示如何调用 GetCurrentProcess、LookupAccountSid、, AllocateAndInitializeSid, OpenProcessToken,以及 获取信息以便 确定当前进程是否正确 在管理员的领导下执行 账户这通常意味着 用户是管理员组的成员, 但在某些情况下(例如。 作为服务运行,或者可能 指定不同于 由GetCurrentProcess返回的), 返回值指示 进程正在帐户下运行 具有管理员权限。(注意 插图应为“当前” “过程”而不是“用户”是最重要的 准确。)


编辑:我是肯。添加了CloseHandle(hToken)