Een DACL maken

Het maken van een juiste discretionaire toegangsbeheerlijst (DACL) is een noodzakelijk en belangrijk onderdeel van de ontwikkeling van toepassingen. Omdat een NULL-DACL alle typen toegang toestaat voor alle gebruikers, gebruikt u geen NULL-DACL's .

Warning

Een NULL DACL verleent volledige toegang tot iedereen, inclusief niet-vertrouwde gebruikers en externe aanvallers. Gebruik nooit een NULL DACL voor een beveiligbaar object. Als u brede toegang wilt toestaan, maakt u een expliciete DACL die de vereiste minimale machtigingen verleent. Een lege DACL (een DACL met nul ACL's) weigert alle toegang. Dit is de veilige standaardinstelling als u niet zeker weet welke machtigingen u moet verlenen.

In het volgende voorbeeld ziet u hoe u een DACL op de juiste manier maakt. Het voorbeeld bevat een functie, CreateMyDACL, die gebruikmaakt van de definitietaal van de beveiligingsdescriptor (SDDL) om het verleende en geweigerde toegangsbeheer in een DACL te definiëren. Als u andere toegang wilt bieden voor de objecten van uw toepassing, wijzigt u indien nodig de functie CreateMyDACL.

In het voorbeeld:

  1. De hoofdfunctie geeft een adres van een SECURITY_ATTRIBUTES structuur door aan de functie CreateMyDACL.

  2. De functie CreateMyDACL maakt gebruik van SDDL-tekenreeksen om:

    • Gasten en gebruikers met anonieme aanmeldingen toegang weigeren.
    • Lees-/schrijf-/uitvoertoegang voor geverifieerde gebruikers toestaan.
    • Hiermee staat u volledig beheer toe aan beheerders.

    Zie Security Descriptor String Format voor meer informatie over de SDDL-tekenreeksindelingen.

  3. Met de functie CreateMyDACL wordt de functie ConvertStringSecurityDescriptorToSecurityDescriptor aangeroepen om de SDDL-tekenreeksen te converteren naar een beveiligingsdescriptor. De beveiligingsdescriptor wordt verwezen naar het lpSecurityDescriptor-lid van de SECURITY_ATTRIBUTES-structuur . CreateMyDACL verzendt de retourwaarde van ConvertStringSecurityDescriptorToSecurityDescriptor naar de hoofdfunctie.

  4. De hoofdfunctie maakt gebruik van de bijgewerkte SECURITY_ATTRIBUTES structuur om de DACL op te geven voor een nieuwe map die door de functie CreateDirectory wordt gemaakt.

  5. Wanneer de hoofdfunctie is voltooid met behulp van de SECURITY_ATTRIBUTES structuur, maakt de hoofdfunctie het geheugen vrij dat is toegewezen voor het lid lpSecurityDescriptor door de functie LocalFree aan te roepen.

Note

Als u SDDL-functies zoals ConvertStringSecurityDescriptorToSecurityDescriptor correct wilt compileren, moet u de constante _WIN32_WINNT definiëren als 0x0500 of hoger. Voor moderne toepassingen moet u ten minste Windows 10 (0x0A00) gebruiken.

#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);
}