ConvertSidToStringSid

Aus API-Wiki
Version vom 5. November 2016, 22:46 Uhr von Jochen Wierum (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Die Funktion ConvertSidToStringSid konvertiert eine SID aus der binären Form in die Textform. Um die Textform wieder in eine SID zurückzuwandeln kann die Funktion ConvertStringSidToSid verwendet werden.

Private Declare Function ConvertSidToStringSidA Lib "ADVAPI32.dll" ( _
                         ByRef lpSid As Any, _
                         ByRef lpStringSid As Long) As Long

Private Declare Function ConvertSidToStringSidW Lib "ADVAPI32.dll" ( _
                         ByRef lpSid As Any, _
                         ByRef lpStringSid As Long) As Long

Parameter

lpSid

[in] bezeichnet einen Zeiger auf eine SID

lpStringSid

[out] bezeichnet eine Variable, welche den Zeiger auf den String aufnehmen kann. Um den zurückgegebenen Speicher wieder freizugeben muss die Funktion LocalFree benutzt werden.

Rückgabe

Wenn die Funktion erfolgreich war, so ist der Rückgabewert ungleich 0. Andernfalls ist ein Fehler aufgetreten, die Fehlernummer kann mit Err.LastDLLError ermittelt werden.

Const ERROR_NOT_ENOUGH_MEMORY As Long = 8
Const ERROR_INVALID_SID As Long = 1337&
Const ERROR_INVALID_PARAMETER As Long = 87

Hinweise

Um den String auch in ein Basic-String umwandeln zu können, muss dieser kopiert werden. Dazu stellt Windows Funktionen wie lstrlenA und lstrcpyA zur Unterstützung bereit. Die Funktion steht auch als UNICODE Version auf NT basierenden Systemen zur Verfügung und sollte auf diesen auch benutzt werden.

Beispiel

Option Explicit

Private Declare Function ConvertSidToStringSidW Lib "advapi32.dll" ( _
        ByRef lpSid As Any, _
        ByRef lpStringSid As Long) As Long
                         
Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenW" ( _
        ByVal lpString As Long) As Long
        
Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyW" ( _
        ByVal lpString1 As Long, ByVal lpString2 As Long) As Long
        
Private Declare Function LocalFree Lib "kernel32.dll" ( _
        ByVal hMem As Long) As Long
        
Private Declare Function LookupAccountName Lib "advapi32.dll" Alias "LookupAccountNameW" ( _
    ByVal lpSystemName As Long, ByVal lpAccountName As Long, _
    ByRef Sid As Any, ByRef cbSid As Long, _
    ByVal ReferencedDomainName As Long, ByRef cbReferencedDomainName As Long, _
    ByRef peUse As Long) As Long

Const ERROR_NONE_MAPPED As Long = 1332
Const ERROR_INSUFFICIENT_BUFFER As Long = 122

Function GetStringSid(sAccount As String) As String
Dim ret As Long, bSid() As Byte, cbSid As Long
Dim sDom As String, cbDom As Long
Dim lpStrSid As Long, peUse As Long
    ' SID ermitteln
    Call LookupAccountName(0, StrPtr(sAccount), ByVal 0, cbSid, 0, cbDom, peUse)
    If Err.LastDllError = ERROR_INSUFFICIENT_BUFFER Then
        ' Speicher holen und SID auslesen
        ReDim bSid(0 To cbSid - 1): sDom = String$(cbDom - 1, 0)
        Call LookupAccountName(0, StrPtr(sAccount), bSid(0), cbSid, StrPtr(sDom), cbDom, peUse)
        ' SID in eine String-SID konvertieren
        If ConvertSidToStringSidW(bSid(0), lpStrSid) Then
            ' Speicher in VB holen
            GetStringSid = String$(lstrlen(lpStrSid), 0)
            ' String-SID kopieren
            Call lstrcpy(StrPtr(GetStringSid), lpStrSid)
            ' Speicher freigeben
            Call LocalFree(lpStrSid)
        End If
    End If
End Function

Private Sub Form_Load()
    Debug.Print GetStringSid("Administrator")
End Sub

Betriebssystem

Die API-Funktion ist unter folgenden Betriebssystemen funktionsfähig:

  • Windows 2000 oder höher

Verwandte Funktionen

Weblinks

MSDN Library: ConvertSidToStringSid