Níveis de representação (autorização)

A enumeração SECURITY_IMPERSONATION_LEVEL define quatro níveis de representação que determinam as operações que um servidor pode executar no contexto do cliente.

Nível de representação Descrição
SecurityAnonymous O servidor não pode representar ou identificar o cliente.
SecurityIdentification O servidor pode obter a identidade e os privilégios do cliente, mas não pode representar o cliente.
SecurityImpersonation O servidor pode representar o contexto de segurança do cliente no sistema local.
SecurityDelegation O servidor pode representar o contexto de segurança do cliente em sistemas remotos.

 

O cliente de uma conexão de pipe, RPC ou DDE nomeada pode controlar o nível de representação. Por exemplo, um cliente de pipe nomeado pode chamar a função CreateFile para abrir um identificador para um pipe nomeado e especificar o nível de representação do servidor.

Quando a conexão de pipe nomeado, RPC ou DDE é remota, os sinalizadores passados para CreateFile para definir o nível de representação são ignorados. Nesse caso, o nível de representação do cliente é determinado pelos níveis de representação habilitados pelo servidor, que é definido por um sinalizador na conta do servidor no serviço de diretório. Por exemplo, se o servidor estiver habilitado para delegação, o nível de representação do cliente também será definido como delegação mesmo que os sinalizadores passados para CreateFile especifiquem o nível de representação de identificação.

Os clientes DDE usam a função DdeSetQualityOfService com a estrutura SECURITY_QUALITY_OF_SERVICE para especificar o nível de representação. O nível SecurityImpersonation é o padrão para servidores nomeados pipe, RPC e DDE. As funções ImpersonateSelf, DuplicateToken e DuplicateTokenEx permitem que o chamador especifique um nível de representação. Use a função GetTokenInformation para recuperar o nível de representação de um token de acesso.

No nível SecurityImpersonation, a maioria das ações do thread ocorre no contexto de segurança do token de representação do thread e não no token primário do processo que possui o thread. Por exemplo, se um thread de representação abrir um objeto protegível, o sistema usará o token de representação para marcar o acesso do thread. Da mesma forma, se um thread de representação criar um novo objeto, por exemplo, chamando a função CreateFile , o proprietário do novo objeto será o proprietário padrão do token de acesso do cliente.

No entanto, o sistema usa o token primário do processo em vez do token de representação do thread de chamada nas seguintes situações:

  • Se um thread de representação chamar a função CreateProcess , o novo processo sempre herdará o token primário do processo.
  • Para funções que exigem o privilégio SE_TCB_NAME, como a função LogonUser , o sistema sempre verifica o privilégio no token primário do processo.
  • Para funções que exigem o privilégio SE_AUDIT_NAME, como a função ObjectOpenAuditAlarm , o sistema sempre verifica o privilégio no token primário do processo.
  • Em uma chamada para a função OpenThreadToken , um thread pode especificar se a função usa o token de representação ou o token primário para determinar se deseja conceder o acesso solicitado.