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.
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