Membuat DACL

Membuat daftar kontrol akses diskresi (DACL) yang tepat adalah bagian yang diperlukan dan penting dari pengembangan aplikasi. Karena NULL DACL mengizinkan semua jenis akses ke semua pengguna, jangan gunakan NULL DACL.

Contoh berikut menunjukkan cara membuat DACL dengan benar. Contohnya berisi fungsi, CreateMyDACL, yang menggunakan bahasa definisi deskriptor keamanan (SDDL) untuk menentukan kontrol akses yang diberikan dan ditolak dalam DACL. Untuk menyediakan akses yang berbeda untuk objek aplikasi Anda, ubah fungsi CreateMyDACL sesuai kebutuhan.

Dalam contoh:

  1. Fungsi utama meneruskan alamat struktur SECURITY_ATTRIBUTES ke fungsi CreateMyDACL.

  2. Fungsi CreateMyDACL menggunakan string SDDL untuk:

    • Tolak akses ke pengguna masuk tamu dan anonim.
    • Izinkan akses baca/tulis/jalankan ke pengguna yang diautentikasi.
    • Izinkan kontrol penuh kepada administrator.

    Untuk informasi selengkapnya tentang format string SDDL, lihat Format String Deskriptor Keamanan.

  3. Fungsi CreateMyDACL memanggil fungsi ConvertStringSecurityDescriptorToSecurityDescriptor untuk mengonversi string SDDL menjadi deskriptor keamanan. Deskriptor keamanan diarahkan oleh anggota lpSecurityDescriptor dari struktur SECURITY_ATTRIBUTES . CreateMyDACL mengirimkan nilai pengembalian dari ConvertStringSecurityDescriptorToSecurityDescriptor ke fungsi utama.

  4. Fungsi utama menggunakan struktur SECURITY_ATTRIBUTES yang diperbarui untuk menentukan DACL untuk folder baru yang dibuat oleh fungsi CreateDirectory .

  5. Ketika fungsi utama selesai menggunakan struktur SECURITY_ATTRIBUTES , fungsi utama membebaskan memori yang dialokasikan untuk anggota lpSecurityDescriptor dengan memanggil fungsi LocalFree .

Catatan

Agar berhasil mengkompilasi fungsi SDDL seperti ConvertStringSecurityDescriptorToSecurityDescriptor, Anda harus menentukan konstanta _WIN32_WINNT sebagai 0x0500 atau lebih besar.

 

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