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.