Erstellen einer DACL

Das Erstellen einer ordnungsgemäßen dacl (Discretionary Access Control List ) ist ein notwendiger und wichtiger Teil der Anwendungsentwicklung. Da eine NULL-DACL alle Arten von Zugriff für alle Benutzer zulässt, verwenden Sie keine NULL-DACLs .

Das folgende Beispiel zeigt, wie Sie eine DACL ordnungsgemäß erstellen. Das Beispiel enthält die Funktion CreateMyDACL, die die Security Descriptor Definition Language (SDDL) verwendet, um die gewährte und verweigerte Zugriffssteuerung in einer DACL zu definieren. Um einen anderen Zugriff auf die Objekte Ihrer Anwendung bereitzustellen, ändern Sie die CreateMyDACL-Funktion nach Bedarf.

Im Beispiel:

  1. Die Standard-Funktion übergibt eine Adresse einer SECURITY_ATTRIBUTES-Struktur an die CreateMyDACL-Funktion.

  2. Die CreateMyDACL-Funktion verwendet SDDL-Zeichenfolgen für Folgendes:

    • Verweigern des Zugriffs für Gastbenutzer und anonyme Anmeldebenutzer.
    • Zulassen des Lese-,Schreib-/Ausführungszugriffs für authentifizierte Benutzer.
    • Vollzugriff für Administratoren zulassen.

    Weitere Informationen zu den SDDL-Zeichenfolgenformaten finden Sie unter Sicherheitsdeskriptorzeichenfolgenformat.

  3. Die CreateMyDACL-Funktion ruft die ConvertStringSecurityDescriptorToSecurityDescriptor-Funktion auf, um die SDDL-Zeichenfolgen in einen Sicherheitsdeskriptor zu konvertieren. Auf den Sicherheitsdeskriptor zeigt der lpSecurityDescriptor-Member der SECURITY_ATTRIBUTES-Struktur . CreateMyDACL sendet den Rückgabewert von ConvertStringSecurityDescriptorToSecurityDescriptor an die funktion Standard.

  4. Die Standard-Funktion verwendet die aktualisierte SECURITY_ATTRIBUTES-Struktur, um die DACL für einen neuen Ordner anzugeben, der von der CreateDirectory-Funktion erstellt wird.

  5. Wenn die Standard-Funktion mithilfe der SECURITY_ATTRIBUTES-Struktur abgeschlossen ist, gibt die funktion Standard den für den lpSecurityDescriptor-Member zugewiesenen Arbeitsspeicher frei, indem die LocalFree-Funktion aufgerufen wird.

Hinweis

Um SDDL-Funktionen wie ConvertStringSecurityDescriptorToSecurityDescriptor erfolgreich zu kompilieren, müssen Sie die _WIN32_WINNT Konstante als 0x0500 oder höher definieren.

 

#define _WIN32_WINNT 0x0500

#include <windows.h>
#include <sddl.h>
#include <stdio.h>

#pragma comment(lib, "advapi32.lib")

BOOL CreateMyDACL(SECURITY_ATTRIBUTES *);

void main()
{
     SECURITY_ATTRIBUTES  sa;
      
     sa.nLength = sizeof(SECURITY_ATTRIBUTES);
     sa.bInheritHandle = FALSE;  

     // Call function to set the DACL. The DACL
     // is set in the SECURITY_ATTRIBUTES 
     // lpSecurityDescriptor member.
     if (!CreateMyDACL(&sa))
     {
         // Error encountered; generate message and exit.
         printf("Failed CreateMyDACL\n");
         exit(1);
     }

     // Use the updated SECURITY_ATTRIBUTES to specify
     // security attributes for securable objects.
     // This example uses security attributes during
     // creation of a new directory.
     if (0 == CreateDirectory(TEXT("C:\\MyFolder"), &sa))
     {
         // Error encountered; generate message and exit.
         printf("Failed CreateDirectory\n");
         exit(1);
     }

     // Free the memory allocated for the SECURITY_DESCRIPTOR.
     if (NULL != LocalFree(sa.lpSecurityDescriptor))
     {
         // Error encountered; generate message and exit.
         printf("Failed LocalFree\n");
         exit(1);
     }
}


// CreateMyDACL.
//    Create a security descriptor that contains the DACL 
//    you want.
//    This function uses SDDL to make Deny and Allow ACEs.
//
// Parameter:
//    SECURITY_ATTRIBUTES * pSA
//    Pointer to a SECURITY_ATTRIBUTES structure. It is your
//    responsibility to properly initialize the 
//    structure and to free the structure's 
//    lpSecurityDescriptor member when you have
//    finished using it. To free the structure's 
//    lpSecurityDescriptor member, call the 
//    LocalFree function.
// 
// Return value:
//    FALSE if the address to the structure is NULL. 
//    Otherwise, this function returns the value from the
//    ConvertStringSecurityDescriptorToSecurityDescriptor 
//    function.
BOOL CreateMyDACL(SECURITY_ATTRIBUTES * pSA)
{
     // Define the SDDL for the DACL. This example sets 
     // the following access:
     //     Built-in guests are denied all access.
     //     Anonymous logon is denied all access.
     //     Authenticated users are allowed 
     //     read/write/execute access.
     //     Administrators are allowed full control.
     // Modify these values as needed to generate the proper
     // DACL for your application. 
     TCHAR * szSD = TEXT("D:")       // Discretionary ACL
        TEXT("(D;OICI;GA;;;BG)")     // Deny access to 
                                     // built-in guests
        TEXT("(D;OICI;GA;;;AN)")     // Deny access to 
                                     // anonymous logon
        TEXT("(A;OICI;GRGWGX;;;AU)") // Allow 
                                     // read/write/execute 
                                     // to authenticated 
                                     // users
        TEXT("(A;OICI;GA;;;BA)");    // Allow full control 
                                     // to administrators

    if (NULL == pSA)
        return FALSE;

     return ConvertStringSecurityDescriptorToSecurityDescriptor(
                szSD,
                SDDL_REVISION_1,
                &(pSA->lpSecurityDescriptor),
                NULL);
}