Propagação automática de ACEs herdáveis
As funções SetNamedSecurityInfo e SetSecurityInfo dão suporte à propagação automática de ACEs ( entradas de controle de acesso herdáveis). Por exemplo, se você usar essas funções para adicionar uma ACE herdável a um diretório em um NTFS, o sistema aplicará a ACE conforme apropriado às ACLs ( listas de controle de acesso ) de quaisquer subdiretórios ou arquivos existentes.
AcEs aplicados diretamente têm precedência sobre ACEs herdados. O sistema implementa essa precedência colocando ACEs aplicadas diretamente à frente de ACEs herdadas em uma DACL ( lista de controle de acesso discricionário ). Quando você chama as funções SetNamedSecurityInfo e SetSecurityInfo para definir as informações de segurança de um objeto, o sistema impõe o modelo de herança atual nas ACLs de todos os objetos na hierarquia abaixo do objeto de destino. Para objetos que foram convertidos no modelo de herança atual, os bits SE_DACL_AUTO_INHERITED e SE_SACL_AUTO_INHERITED são definidos no campo de controle do descritor de segurança do objeto.
Quando você cria um novo descritor de segurança que reflete o modelo de herança atual, é preciso ter cuidado para não alterar a semântica do descritor de segurança. Dessa forma, as ACEs allow e deny nunca são movidas umas com as outras. Se esse movimento for necessário (por exemplo, para colocar todos os ACEs não herdados na frente de uma ACL), a ACL será marcada como protegida para evitar a alteração semântica.
O sistema usa as seguintes regras ao propagar ACEs herdadas para objetos filho:
- Se um objeto filho sem DACL herdar um ACE, o resultado será um objeto filho com uma DACL que contém apenas o ACE herdado.
- Se um objeto filho com uma DACL vazia herdar uma ACE, o resultado será um objeto filho com uma DACL que contém apenas o ACE herdado.
- Se você remover uma ACE herdável de um objeto pai, a herança automática removerá todas as cópias da ACE que foram herdadas por objetos filho.
- Se a herança automática resultar na remoção de todas as ACEs da DACL de um objeto filho, o objeto filho terá uma DACL vazia em vez de nenhuma DACL.
Essas regras podem ter o resultado inesperado da conversão de um objeto sem DACL em um objeto com uma DACL vazia. Um objeto sem DACL permite acesso completo, mas um objeto com uma DACL vazia não permite acesso. Como exemplo de como essas regras podem criar uma DACL vazia, suponha que você adicione uma ACE herdável ao objeto raiz de uma árvore de objetos. A herança automática propaga o ACE herdável para todos os objetos na árvore. Objetos filho que começaram sem DACL agora têm uma DACL com o ACE herdado. Se você remover o ACE herdável do objeto raiz, o sistema propagará automaticamente a alteração para os objetos filho. Objetos filho que começaram sem DACL (permitindo acesso completo) agora têm uma DACL vazia (não permitindo acesso).
Para garantir que um objeto filho sem DACL não seja afetado por ACEs herdáveis, defina o sinalizador SE_DACL_PROTECTED no descritor de segurança do objeto.
Para obter informações sobre como criar corretamente uma DACL, consulte Criando uma DACL.