ConvertSecurityDescriptorToStringSecurityDescriptor

Aus API-Wiki
Zur Navigation springenZur Suche springen

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. <<syntaxhighlight lang="vb">>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& </<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

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</<syntaxhighlight lang="vb">> Aufgerufen kann die Funktion so: <<syntaxhighlight lang="vb">>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</<syntaxhighlight lang="vb">>

Betriebssystem

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

  • Windows 2000 oder höher

Verwandte Funktionen

Weblinks

MSDN Library: ConvertSecurityDescriptorToStringSecurityDescriptor