Como adquirir privilégio de administrador com UAC?

 

Um programa pode requisitar privilégio em diversas formas. Uma forma é adicionar sessão requestedPrivileges a um documento XML conhecido como manifesto, que deverá ser embutido na aplicação.

Um manifesto poderá especificar dependências, estilos visuais, e agora o contexto de segurança apropriado:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <v3:trustInfo xmlns:v3="urn:schemas-microsoft-com:asm.v3">
    <v3:security>
      <v3:requestedPrivileges>
        <v3:requestedExecutionLevel level="highestAvailable" />
      </v3:requestedPrivileges>
    </v3:security>
  </v3:trustInfo>
</assembly>

Definindo o atributo de nível requestedExecutionLevel como "asInvoker" fará com que a aplicação seja executada com o nível de segurança em que foi inicializada, "highestAvailable" irá apresentar um diálogo para administradores e executar com nível comum de usuário de privilégios reduzidos, e "requireAdministrator" irá requisitar elevação de nível. Em ambos modos "highestAvaiable" e "requireAdministrator", uma falha na confirmação fará com que o programa não seja carregado.

Um executável marcado como "requireAdministrator" no seu manifesto não pode ser iniciado a partir de um processo não-elevado usando CreateProcess(). Ao invés disto, um erro ERROR_ELEVATION_REQUIRED será retornado. Neste caso ShellExecute ou ShellExecuteEx deverá ser utilizado. Se não for fornecido um HWND, então o diálogo será mostrado piscando na barra de tarefas.

Não é recomendado examinar o manifesto de um executável para determinar se ele precisa da elevação, pois a elevação pode ser requisitada por outras razões (programas de instalação, compatibilidade de programas). Porém, é possível através de código detectar se um executável irá requisitar elevação utilizando CreateProcess() e definindo o parâmetro dwCreationFlags com CREATE_SUSPENDED. Se a elevação for requisitada,  então o erro ERROR_ELEVATION_REQUIRED será retornado. Se não for necessário elevação, um código de sucesso será retornado e neste ponto você poderá usar TerminateProcess() para suspender o processo. Isto não o ajudará a detectar se um programa requer elevação, se você já estiver executando em um processo elevado.

Para aplicações Win32 nativas, o verbo "runas" pode ser utilizado como parâmetro a uma chamada ShellExecute() ou ShellExecuteEx().

ShellExecute(hwnd, "runas", "C:\\Windows\\Notepad.exe", 0, 0, SW_SHOWNORMAL);

Referência

 
 
 

0 Comments

 

You can be the first one to leave a comment.

 

Leave a Comment

 




XHTML: You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>