ConvertSecurityDescriptorToStringSecurityDescriptor

Aus API-Wiki
Wechseln zu: Navigation, Suche

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