Como fazer um aplicativo .NET sempre ser executado como administrador? (E não enlouquecer)
Olá, colega! Se você já escreveu um utilitário para trabalhar com o registro, instalar serviços do Windows ou apenas tentou salvar um arquivo em C:\\Program Files, certamente já passou por isso: o aplicativo trava com o erro "Access Denied", o usuário dá de ombros e você coça a cabeça. Situação familiar? Bem-vindo ao mundo do UAC (User Account Control) e da eterna luta por privilégios de administrador.
Hoje vamos analisar a pergunta mais popular no Stack Overflow (sim, aquela com milhares de visualizações): "How do I force my .NET application to run as administrator?". Não vamos apenas copiar a resposta, vamos entender como funciona e escrever um código elegante em C#. Vamos lá!
Por que não é tão simples? A magia do UAC
O Windows, desde o Vista, não confia em aplicativos por padrão. Mesmo que você esteja logado como "Administrador", seu processo recebe um token com privilégios filtrados. Isso é feito por segurança: para que um vírus não possa simplesmente sobrescrever arquivos do sistema.
Quando você executa um .exe, o sistema verifica seu manifesto. Se não houver uma marcação especial, o aplicativo é executado com privilégios de usuário comum. Nossa tarefa é adicionar essa marcação.
Método 1: Adicionando o manifesto (caminho correto para .NET Framework)
Esta é a maneira padrão e mais simples para aplicativos clássicos Windows Forms ou WPF no .NET Framework.
Passo 1: Criar ou editar o arquivo app.manifest
No Visual Studio, clique com o botão direito no projeto → Add → New Item → Application Manifest File. Se o arquivo já existir (por exemplo, app.manifest), basta abri-lo.
Você verá um XML com vários comentários. A seção que nos interessa é requestedExecutionLevel. Deixe-a assim:
<?xml version="1.0" encoding="utf-8"?><assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"> <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges> <!-- IMPORTANTE: Esta linha --> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo></assembly>Observe o level="requireAdministrator". Existem outros dois valores:
asInvoker— execução com os privilégios do processo pai (padrão).highestAvailable— execução com os privilégios máximos disponíveis para o usuário atual.
Passo 2: Vincular o manifesto ao projeto (se não funcionar automaticamente)
Abra as propriedades do projeto (clique com o botão direito no projeto → Properties). Na guia Application, encontre a seção Resources e, na lista suspensa "Manifest", selecione "app.manifest".
Pronto! Agora, ao executar seu .exe, o Windows exibirá imediatamente a janela do UAC: "Permitir que este aplicativo faça alterações no seu dispositivo?". Se o usuário clicar em "Sim", o aplicativo receberá privilégios totais de administrador.
Método 2: Reinicialização programática com elevação (para .NET Core / .NET 5+)
Este método é universal e funciona até mesmo no .NET Core, .NET 5/6/7/8 e .NET Framework. Às vezes, o manifesto não é adequado porque:
- Você quer que o aplicativo seja executado sem privilégios, mas algumas funções exigem elevação.
- Você está usando um aplicativo de console ou serviço.
A ideia é simples: o aplicativo verifica se tem privilégios. Se não tiver, ele executa a si mesmo novamente, mas com a chave runas (de