Pergunta

Fundo: Eu sou de nenhuma maneira uma segurança janelas / permissões de usuário especialista. Tenho uma aplicação (escrito em C #), que tem de ser capaz de gravar arquivos / Delete e pastas no seu diretório raiz, gravação / apagar arquivos em outro lugar no disco, gravação / modificar valores no registro do sistema (máquina local) e iniciar o & impedir que outras aplicações e serviços. I figura que eu preciso privilégios de administrador para pelo menos algumas dessas ações.

Eu tentei correr isto e em computadores com UAC desligado ele funciona muito bem, sem qualquer configuração adicional. No entanto, em computadores com UAC ativado (qualquer nível acima de 'nunca notificar' no Windows 7) ele irá travar. Eu preciso dele para trabalhar em todos os computadores.

Até agora eu só iria verificar manualmente a caixa de seleção "executar este programa como administrador" e tudo ficaria bem. No entanto, agora decidimos que vamos permitir que os clientes para instalar este software por conta própria, e ele precisa ser executado "fora da caixa".

Eu tenho um projeto de implantação no Visual Studio 2008 que instala tudo e escreve o começo necessário de segurança dos dados no registro. O que eu preciso fazer agora é definir o "Executar este programa como administrador" bandeira. Eu estou supondo que isso não é tão simples como eu gostaria que fosse.

Então, qual é a maneira correta de fazer isso? Este programa é iniciado na inicialização, e seria irritante para os nossos clientes se UAC iria aparecer (e possivelmente reduzir o brilho da tela) cada vez que reiniciar o seu computador.

Obrigado por sua ajuda.

EDIT: Obrigado pelas suas respostas. Eu percebo que o trabalho em torno de UAC seria desaprovada, e eu posso ver que a Microsoft não suporta "listas brancas" para que ele iria pedir permissão apenas uma vez. Isso é bom eu respeito isso, no entanto eu tenho algumas perguntas de acompanhamento:

  • Você pode me fornecer com um link que vai me mostrar como elevar corretamente o programa de estado elevado correto? Existe alguma literatura sobre quais são as opções, etc ... Basicamente eu adoraria um guia UAC 101.

  • Existe uma maneira de elevar o status de segurança quando eu precisar os privilégios extras (e somente então pedir com UAC). Basicamente este aplicações é executado em segundo plano, fazendo principalmente nada na maior parte do tempo. De vez em quando ele irá verificar alguns arquivos (neste momento eu exigirá para ser capaz de escrever para o disco e ler o registro (somente leitura é bom neste momento), no entanto, já que é uma pasta temporária que não importa onde eu 'd colocá-lo. Se existe um local onde o aplicativo pode escrever sem quaisquer privilégios que seria perfeito.)

    No entanto, em algum momento vou precisar de pré-formar todo o resto das tarefas (as necessidades do usuário para confirmar isso de qualquer maneira ação) por isso, se UAC levaria neste ponto que não seria nenhum problema. Existe uma maneira para elevá-lo apenas neste ponto, e depois devolvê-lo para o padrão permissões?

  • Será que tal solução trabalho com versões mais antigas do Windows, incluindo Vista e XP (e talvez mais velho?) O que seria necessário para fazê-la funcionar?

Foi útil?

Solução

A maneira correta é elevar quando o programa começa, com o UAC prompt de (que você pode definir através do programa manifesto) -. Tentando ser inteligente e desvio é desaprovado

Pense nisso? - se você pudesse instalar algo que elevaria automaticamente sem o UAC prompt de ... o que seria o ponto de UAC

Para adicionar um UAC manifesto para um programa que você simplesmente adicionar o manifesto em um projeto e editá-lo. Um manifesto de amostra para UAC é aqui . Se você quiser elevar no último momento possível, então você precisa de um processo separado desova - você não pode elevar um processo existente. Então separar esse bocado para fora e depois iniciá-lo usando

Process.StartInfo.UseShellExecute = true;
Process.StartInfo.Verb = "runas";

Outras dicas

Você precisa repensar a forma como o aplicativo funciona. Você é muito correto que seria chato para exibir uma elevação rápida no login. Portanto, não fazê-lo. Por outro lado, você pode muito bem ter tarefas que você precisa executar usando o acesso administrativo.

Então, você tem duas opções:

  • Alterar as suas tarefas de modo que eles já não exigem elevação administrativa (por exemplo, escrever seus arquivos em outro lugar).
  • Quebre seu aplicativo em um componente de serviço Windows e um componente de interface do usuário. O componente de serviço pode ser executado sob uma conta elevada (esperemos que o menos conta -elevated necessário para executar as tarefas que você precisa fazer). O componente de interface com o usuário pode conversar com o serviço (via pipes nomeados ou similar), quando necessário.

Você pode dividir seu programa em duas componentes:

  • a aplicação do usuário em execução sem elevação
  • um serviço do Windows que é responsável pelas tarefas que exigem elevação

Uma vez que você estiver usando .NET, a comunicação entre os componentes é provavelmente mais fácil feito usando WCF.

E como uma nota lateral: programaticamente modificar arquivos em C: \ Arquivos de Programas não é considerada uma boa prática e pode levar a uma série de outros problemas. Windows tem lugares dedicados para armazenar configurações e outros dados do programa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top