Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A criação de uma DACL (lista de controle de acesso discricionário ) adequada é uma parte necessária e importante do desenvolvimento de aplicativos. Como um DACL NULL permite todos os tipos de acesso a todos os usuários, não use DACLs NULL .
Aviso
Uma DACL NULL concede acesso total a todos, incluindo usuários não confiáveis e invasores remotos. Nunca use um DACL NULL em nenhum objeto protegível. Se você precisar permitir acesso amplo, crie uma DACL explícita que conceda as permissões mínimas necessárias. Um DACL vazio (uma DACL sem ACEs) nega todo o acesso. Esse é o padrão seguro se você não tiver certeza de quais permissões conceder.
O exemplo a seguir mostra como criar corretamente uma DACL. O exemplo contém uma função, CreateMyDACL, que usa a linguagem de definição de descritor de segurança (SDDL) para definir o controle de acesso concedido e negado em uma DACL. Para fornecer acesso diferente aos objetos do aplicativo, modifique a função CreateMyDACL conforme necessário.
No exemplo:
A função principal passa um endereço de uma estrutura SECURITY_ATTRIBUTES para a função CreateMyDACL.
A função CreateMyDACL usa cadeias de caracteres SDDL para:
- Negar acesso a usuários de logon anônimos e convidados.
- Permitir acesso de leitura/gravação/execução a usuários autenticados.
- Permitir controle total aos administradores.
Para obter mais informações sobre os formatos de cadeia de caracteres SDDL, consulte Formato de cadeia de caracteres do Descritor de Segurança.
A função CreateMyDACL chama a função ConvertStringSecurityDescriptorToSecurityDescriptor para converter as cadeias de caracteres SDDL em um descritor de segurança. O descritor de segurança é apontado pelo membro lpSecurityDescriptor da estrutura de SECURITY_ATTRIBUTES . CreateMyDACL envia o valor retornado de ConvertStringSecurityDescriptorToSecurityDescriptor para a função principal.
A função principal usa a estrutura de SECURITY_ATTRIBUTES atualizada para especificar a DACL para uma nova pasta criada pela função CreateDirectory .
Quando a função principal é concluída usando a estrutura SECURITY_ATTRIBUTES , a função principal libera a memória alocada para o membro lpSecurityDescriptor chamando a função LocalFree .
Note
Para compilar com êxito funções SDDL, como ConvertStringSecurityDescriptorToSecurityDescriptor, você deve definir a constante _WIN32_WINNT como 0x0500 ou superior. Para aplicativos modernos, tenha como alvo pelo menos o Windows 10 (0x0A00).
#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);
}