5

VB6で維持しなければならない古いコードがいくつかあります。現在のユーザーのSIDを検索する機能を追加する必要があります。誰かがそれを行う方法を示すコードを教えてもらえますか?よろしくお願いします!

4

4 に答える 4

9

これを試して

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
于 2009-10-20T23:40:58.930 に答える
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

実装されたリンクは次のとおりです。

于 2009-10-20T21:13:46.290 に答える
0

これは、紛らわしい名前が付けられているが信頼できるVB NETサイト(Microsoftが.NETを発明する前にVB6に専念していた)からのサンプルです。

このデモは、現在のプロセスが管理者アカウントで実行されているかどうかを判断するために、GetCurrentProcess、LookupAccountSid、AllocateAndInitializeSid、OpenProcessToken、およびGetTokenInformationを呼び出す方法を示しています。これは通常、ユーザーが管理者グループのメンバーであることを意味しますが、特定の状況(サービスとして実行している、またはGetCurrentProcessによって返されるプロセスとは異なるプロセスを指定している可能性がある)では、戻り値はプロセスがアカウントで実行されているかどうかを示します管理者権限を持つ。(最も正確に言うと、図には「ユーザー」ではなく「現在のプロセス」と記載されている必要があることに注意してください。)

于 2009-10-22T08:05:23.930 に答える
0

MSDNを少しクルージングすると、NetUserGetInfo関数が探しているものであることがわかります(http://msdn.microsoft.com/en-us/library/aa370654%28VS.85%29.aspx)。そして、Microsoftはすでにここにあなたのための例を書いています:http ://support.microsoft.com/kb/151774

于 2009-10-20T21:21:56.133 に答える