ConvertSecurityDescriptorToStringSecurityDescriptor
Die Funktion ConvertSecurityDescriptorToStringSecurityDescriptor konvertiert einen SECURITY_DESCRIPTOR aus der binären Form in die Textform. Um die Textform wieder in einen SECURITY_DESCRIPTOR zurückzuwandeln kann die Funktion ConvertStringSecurityDescriptorToSecurityDescriptor verwendet werden.
Private Declare Function ConvertSecurityDescriptorToStringSecurityDescriptorA Lib "ADVAPI32.dll" ( _
ByRef SecurityDescriptor As Any, ByVal RequestedStringSDRevision As Long, _
ByVal SecurityInformation As Long, ByRef StringSecurityDescriptor As Long, _
ByRef StringSecurityDescriptorLen As Long) As Long
Private Declare Function ConvertSecurityDescriptorToStringSecurityDescriptorW Lib "ADVAPI32.dll" ( _
ByRef SecurityDescriptor As Any, ByVal RequestedStringSDRevision As Long, _
ByVal SecurityInformation As Long, ByRef StringSecurityDescriptor As Long, _
ByRef StringSecurityDescriptorLen As Long) As Long
Parameter
SecurityDescriptor
- [in] bezeichnet einen Zeiger auf einen SECURITY_DESCRIPTOR
RequestedStringSDRevision
- [in] Der einzig erlaubte Wert ist SDDL_REVISION_1
SecurityInformation
- [in] mit dieser Variable wird bestimmt, welche Informationen in die Textform konvertiert werden sollen.
Konstante Wert Bedeutung OWNER_SECURITY_INFORMATION 1 der Eigentümer wird konvertiert GROUP_SECURITY_INFORMATION 2 die primäre Gruppe wird konvertiert DACL_SECURITY_INFORMATION 4 die DACL Zugriffskontrollliste wird konvertiert SACL_SECURITY_INFORMATION 8 die System Zugriffskontrollliste wird konvertiert LABEL_SECURITY_INFORMATION 10 die Mandantory Zugriffskontrolleinträge werden konvertiert
StringSecurityDescriptor
- [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.
StringSecurityDescriptorLen
- [out]
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_UNKNOWN_REVISION As Long = 1305&
Const ERROR_INVALID_ACL As Long = 1336&
Const ERROR_NONE_MAPPED As Long = 1332&
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
Public Enum SE_OBJECT_TYPE
SE_UNKNOWN_OBJECT_TYPE = 0
SE_FILE_OBJECT
SE_SERVICE
SE_PRINTER
SE_REGISTRY_KEY
SE_LMSHARE
SE_KERNEL_OBJECT
SE_WINDOW_OBJECT
SE_DS_OBJECT
SE_DS_OBJECT_ALL
SE_PROVIDER_DEFINED_OBJECT
SE_WMIGUID_OBJECT
SE_REGISTRY_WOW64_32KEY
End Enum
Private Const DACL_SECURITY_INFORMATION As Long = &H4&
Private Const GROUP_SECURITY_INFORMATION As Long = &H2&
Private Const OWNER_SECURITY_INFORMATION As Long = &H1&
Private Const SDDL_REVISION_1 As Long = 1
Private Declare Function ConvertSecurityDescriptorToStringSecurityDescriptor Lib "ADVAPI32.dll" _
Alias "ConvertSecurityDescriptorToStringSecurityDescriptorW" _
(ByRef SecurityDescriptor As Any, ByVal RequestedStringSDRevision As Long, _
ByVal SecurityInformation As Long, ByRef StringSecurityDescriptor As Long, _
ByRef StringSecurityDescriptorLen As Long) As Long
Private Declare Function LocalFree Lib "kernel32.dll" _
(ByVal hMem 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 GetSecurityInfo Lib "ADVAPI32.dll" _
(ByVal Handle As Long, ByVal ObjectType As SE_OBJECT_TYPE, _
ByVal SecurityInfo As Long, ByRef ppsidOwner As Long, _
ByRef ppsidGroup As Long, ByRef ppDacl As Long, _
ByRef ppSacl As Long, ByRef ppSecurityDescriptor As Long) As Long
Public Function GetStringSecurityDescriptor(ByVal Handle As Long, ByVal ObjectType As SE_OBJECT_TYPE) As String
Dim pSD As Long, pStringSD As Long, cbStringSD As Long, dErr As Long
dErr = GetSecurityInfo(Handle, ByVal ObjectType, DACL_SECURITY_INFORMATION Or OWNER_SECURITY_INFORMATION, ByVal 0, ByVal 0, ByVal 0, ByVal 0, pSD)
If dErr = 0 Then
If ConvertSecurityDescriptorToStringSecurityDescriptor(ByVal pSD, SDDL_REVISION_1, DACL_SECURITY_INFORMATION Or OWNER_SECURITY_INFORMATION, pStringSD, cbStringSD) Then
GetStringSecurityDescriptor = String$(cbStringSD, 0)
Call lstrcpy(StrPtr(GetStringSecurityDescriptor), pStringSD)
Call LocalFree(pStringSD)
End If
Call LocalFree(pSD)
End If
End Function
Aufgerufen kann die Funktion so:
Option Explicit
Private Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000
Private Const SYNCHRONIZE As Long = &H100000
Private Const PROCESS_ALL_ACCESS As Long = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF)
Private Declare Function OpenProcess Lib "kernel32.dll" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32.dll" () As Long
Private Declare Function CloseHandle Lib "kernel32.dll" _
(ByVal hObject As Long) As Long
Private Sub Form_Load()
Dim hProcess As Long
hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, GetCurrentProcessId)
Debug.Print GetStringSecurityDescriptor(hProcess, SE_KERNEL_OBJECT)
Call CloseHandle(hProcess)
End Sub
Betriebssystem
Die API-Funktion ist unter folgenden Betriebssystemen funktionsfähig:
- Windows 2000 oder höher
Verwandte Funktionen
Weblinks
MSDN Library: ConvertSecurityDescriptorToStringSecurityDescriptor