Como forço meu aplicativo .NET a ser executado como administrador?

876

Depois que meu programa é instalado em uma máquina cliente, como forço meu programa a ser executado como administrador no Windows 7?

Ouro
fonte
3
Além do que Binary Worrier escreveu, você pode querer escrever algum código para testar se você tem privilégios de administrador .. (é que o que você está pedindo?)
lexu
39
Porém, eu não aceitaria essa tarefa com leviandade, você deve verificar o que realmente precisa de administrador e ver se pode contorná-la. Nenhum cliente ficará feliz em executar um aplicativo no modo de administrador o tempo todo. Muitos clientes maiores nem sequer consideram um aplicativo como esse e, se o teste do logotipo for importante para você, ele não será aprovado assim.
Alex
2
Alex está muito no ponto. Se possível, eleve apenas quando necessário; caso contrário, a Diretiva de Grupo, o UAC e várias outras variáveis ​​entram em jogo. No mínimo, com o UAC, o usuário precisaria autorizar a cada execução, e não apenas quando uma ação específica do usuário for executada.
Anthony Mason
A maneira correta é incorporar um arquivo de manifesto no seu aplicativo.
Elmue 03/10/19

Respostas:

1145

Você deseja modificar o manifesto incorporado ao programa. Isso funciona no Visual Studio 2008 e superior: Projeto + Adicionar novo item, selecione "Arquivo de manifesto do aplicativo". Mude o <requestedExecutionLevel>elemento para:

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

O usuário recebe o prompt do UAC quando inicia o programa. Use sabiamente; sua paciência pode se desgastar rapidamente.

Hans Passant
fonte
33
Se você receber um erro do ClickOnce ao tentar compilar, consulte esta resposta: stackoverflow.com/questions/11023998/…
SSS
17
Seu projeto também precisa ser configurado para usar o manifesto do aplicativo - nas Propriedades do projeto, marque a guia "Aplicativo" e verifique se "Manifest:" em 'Resources "está definido como seu app.manifest (ou como você nomeou. arquivo de manifesto).
Victor Chelaru
7
Eu tive que recarregar o projeto antes que o VS me pedisse para reiniciar no modo de administrador.
28417 Jon
3
@Alejandro - Sim, o UAC pode ser desativado, mas quando isso ocorre, o aplicativo é executado automaticamente como administrador (assumindo que o usuário tenha privilégios de administrador), porque desativar o UAC significa que tudo é executado com o maior privilégio permitido ao usuário. É como reclamar que, se você instalar uma fechadura sofisticada na porta, ela não funcionará se a porta for removida.
Erik Funkenbusch
4
@ErikFunkenbusch Não será "executado automaticamente como administrador", será executado sob as permissões normais do usuário (admin se o usuário for admin ou padrão se o usuário for padrão). Contar com esse caso específico, mesmo que seja o padrão, é o que bons programas evitarão como a praga. Seguindo sua analogia, a fechadura sofisticada é legal e tudo, mas o software projetado corretamente deve antecipar o caso de a porta inteira ser removida, mesmo que seja uma ocorrência rara.
Alejandro
155

Adicionar um requestedExecutionLevelelemento ao seu manifesto é apenas metade da batalha; você deve se lembrar que o UAC pode ser desligado. Se for, você deve executar a verificação da maneira antiga e abrir uma caixa de diálogo de erro se o usuário não for administrador
(ligue IsInRole(WindowsBuiltInRole.Administrator)para o seu tópico CurrentPrincipal).

Anders
fonte
22
Você também pode usar <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> bem
Mark Kram
18
@MarkKram: O que o mais altoAvailable tem a ver com isso? A pergunta é sobre forçando admin, highestAvailable é menos restritiva que requireAdministrator e permitirá que um usuário não-admin iniciar o aplicativo un-elevada sem UAC, só os administradores vão se solicitado ...
Anders
Não lembro mais os detalhes exatos, mas acho que isso depende do que você entende por desativado. Colocar o "controle deslizante do UAC" até o final não é o mesmo que desabilitar o UAC (exceto no Vista). Se o UAC estiver totalmente desativado, todo o mecanismo de nível de integridade estará desativado e apenas o recurso runas.exe clássico do 2000 / XP estará disponível. A verificação da função de administrador lida com o caso runas.exe.
Anders
1
Tenho definir EnableLUA a 0 sobre Server 2008 R2 e eu removido do grupo Administradores, reinicializado, e agora um exe que nível especifica = corre "requireAdministrator" sem qualquer prompt
Tal Aloni
87

As etapas detalhadas são as seguintes.

  1. Adicionar arquivo de manifesto do aplicativo à solução
  2. Altere a configuração do aplicativo para "app.manifest"
  3. Atualize a tag "requestExecutionLevel" para exigirAdministrador.

Adicionando arquivo na solução

Selecionar arquivo de manifesto do aplicativo

Selecione a opção Manifest

Atualizar arquivo de manifesto

Observe que, usando esse código, você precisa desativar as configurações de segurança do ClickOnce; para isso, entre em Propriedades -> Segurança -> Segurança do ClickOnce

Hassan Rahman
fonte
New Item...não é uma opção no meu projeto do Serviço Instalador. Como eu adicionaria o manifesto do aplicativo? Posso adicioná-lo ao meu projeto principal, mas não é o instalador.
HackSlash 26/03
61

Eu implementei algum código para fazê-lo manualmente:

using System.Security.Principal;
public bool IsUserAdministrator()
{
    bool isAdmin;
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (UnauthorizedAccessException ex)
    {
        isAdmin = false;
    }
    catch (Exception ex)
    {
        isAdmin = false;
    }
    return isAdmin;
}
NG.
fonte
45
Isso só detecta se o contexto está sendo executado como administrador não Forec o aplicativo para executar como administrador, conforme solicitado pelo OP
Matt Wilko
5
Eu não acho que exista uma maneira programática de forçar um aplicativo a elevar suas próprias permissões. Se houvesse, seria um grande risco à segurança, não?
Mark Richman
6
Embora sua solução seja boa, a pergunta era diferente. ;)
Yash
ver uma versão reformulado deste método aqui stackoverflow.com/a/50186997 (subjetiva)
Hakan Fistik
Isso não responde à pergunta!
Elmue
19

Enquanto trabalhava no Visual Studio 2008, clique com o botão direito do mouse Project -> Add New Iteme escolha Application Manifest File.

No arquivo de manifesto, você encontrará a tag requestedExecutionLevele poderá definir o nível para três valores:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

OU

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

OU

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

Para definir seu aplicativo para ser executado como administrador, você deve escolher o meio.

Rashad Maqsood
fonte
Isso funciona. No entanto, fez aparecer uma janela em branco do cmd ao executar o aplicativo CMD (usando o aplicativo c # cmd para executar algum exe em segundo plano).
WM
13

Conforme

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

convém adicionar um manifesto de aplicativo se ainda não tiver um ou não souber como adicioná-lo. Como alguns projetos não adicionam automaticamente um arquivo de manifesto separado, primeiro vá às propriedades do projeto, navegue até o Aplicativo guia e verifique se o seu projeto não está excluindo o manifesto na parte inferior da torneira.

  • Em seguida, clique com o botão direito do mouse no projeto
  • Adicionar novo item
  • Por fim, localize e clique em Arquivo de manifesto do aplicativo
Justin Mcconnell
fonte
12

No Visual Studio 2010, clique com o botão direito do mouse no nome do seu projeto. Aperte "View Windows Settings", isso gera e abre um arquivo chamado "app.manifest". Nesse arquivo, substitua "asInvoker" por "requireAdministrator", conforme explicado nas seções comentadas no arquivo.

Evoluído
fonte
6
Esta resposta é sobre VB.NET :-), não o VS 2010 em geral. As respostas "Adicionar novo item" são sobre C #. Em C ++, você pode fazer isso nas configurações do projeto.
Philm
12

Outra maneira de fazer isso, apenas no código, é detectar se o processo está sendo executado como administrador, como na resposta do @NG. . E, em seguida, abra o aplicativo novamente e feche o atual.

Uso esse código quando um aplicativo precisa apenas de privilégios de administrador quando executado sob certas condições, como quando se instala como um serviço. Portanto, ele não precisa funcionar como administrador o tempo todo, como as outras respostas o forçam também.

Observe no código abaixo NeedsToRunAsAdminum método que detecta se, nas condições atuais, são necessários privilégios de administrador. Se isso retornarfalse o código não se elevará. Essa é uma grande vantagem dessa abordagem em relação às outras.

Embora esse código tenha as vantagens mencionadas acima, ele precisa se reiniciar como um novo processo que nem sempre é o que você deseja.

private static void Main(string[] args)
{
    if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
    {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = Environment.CurrentDirectory;
        proc.FileName = Assembly.GetEntryAssembly().CodeBase;

        foreach (string arg in args)
        {
            proc.Arguments += String.Format("\"{0}\" ", arg);
        }

        proc.Verb = "runas";

        try
        {
            Process.Start(proc);
        }
        catch
        {
            Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
        }
    }
    else
    {
        //Normal program logic...
    }
}

private static bool IsRunAsAdmin()
{
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(id);

    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
TheLethalCoder
fonte
1
+1 para abordagem somente de código. Observe que você precisa do UAC ativado para ter a chance de iniciar qualquer coisa runascomo administrador de um usuário não administrador; caso contrário, ele será aberto silenciosamente com as permissões de usuário atual (verificadas no Windows 7 de 64 bits). Pelo que sei, a única coisa que você pode fazer com o UAC desativado e o direito de administrador está em falta é interromper a execução em um momento adequado.
reallynice
9

Você pode criar o manifesto usando o ClickOnce Security Settings e depois desabilitá-lo:

Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings

Depois de clicar nele, um arquivo será criado na pasta de propriedades do projeto chamada app.manifest, uma vez criado, você pode desmarcar a opçãoEnable ClickOnce Security Settings opção

Abra esse arquivo e altere esta linha:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

para:

 <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

Isso fará com que o programa exija privilégios de administrador.

Yochai Timmer
fonte
7

Esta é uma versão simplificada desta resposta , acima de @NG

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch
    {
        return false;
    }
}
Hakan Fıstık
fonte
1
Isso não responde à pergunta!
Elmue
@ Elmue, é mais lógico adicionar seu comentário à resposta original que acabei de refatorar, você pode encontrar um link para essa resposta na minha.
Hakan Fıstık
-3

Clique com o botão direito do mouse no executável, vá para Propriedades> Compatibilidade e marque a caixa 'Executar este programa como administrador'.

Se você deseja executá-lo como administrador para todos os usuários, faça o mesmo em 'alterar configuração para todos os usuários'.

SlickJayD
fonte
4
Isso não responde à pergunta. "Uma vez que meu programa está instalado em uma máquina cliente", não "como eu".
31514 Joe
Desculpe por não estar claro. Depois que seu programa estiver instalado, altere essa configuração nas propriedades do executável (seu programa principal, não o instalador). Ele quer forçar seu programa a ser executado como administrador.
SlickJayD
2
É melhor definir o requisito de administrador no manifesto. Eu diria que responde à pergunta, mas apenas por pouco.
BradleyDotNET
3
@ Joe Para ser justo, a resposta aceita não responde à pergunta dos OPs, pois exige que você reinstale o aplicativo exe. Isso dificilmente é uma solução para "Depois que meu programa estiver instalado". Se algo que esta resposta com baixa votação estiver mais correto que a resposta aceita, não entendo por que essa resposta tem mais de 400 votos.
NickG
Na verdade, responde perfeitamente a ambas as perguntas. Não há muita chance de alterar o manifesto uma vez instalado e os programas não devem tentar elevar suas permissões depois de executados - em muitos ambientes - é um bom caminho para ser chamado de malware. Na maioria das empresas - essa resposta é a melhor, pois coloca o ônus no usuário e em suas permissões. Escrevo muito código que não consigo "ver" ou executar quando está em produção. Tente não ser mais inteligente do que suas próprias preocupações de segurança.
precisa