ConvertSidToStringSid
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. <<syntaxhighlight lang="vb">>Const ERROR_NOT_ENOUGH_MEMORY As Long = 8 Const ERROR_INVALID_SID As Long = 1337& Const ERROR_INVALID_PARAMETER As Long = 87 </<syntaxhighlight lang="vb">>
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
<<syntaxhighlight lang="vb">>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</<syntaxhighlight lang="vb">>
Betriebssystem
Die API-Funktion ist unter folgenden Betriebssystemen funktionsfähig:
- Windows 2000 oder höher