Pergunta

Para meu aplicativo C#, não quero sempre solicitar a elevação no início do aplicativo, mas se eles escolherem um caminho de saída protegido pelo UAC, precisarei solicitar a elevação.

Então, como posso verificar se um caminho é protegido pelo UAC e como solicito a elevação no meio da execução?

Foi útil?

Solução

A melhor maneira de detectar se eles são incapazes de realizar uma ação é tentar e pegar o UnauthorizedAccessException.

Porém como @Danny Smurf aponta corretamente você só pode elevar um objeto COM ou um processo separado.

Há um aplicativo de demonstração nos exemplos de tecnologia cruzada do SDK do Windows chamado Demonstração do UAC.Este aplicativo de demonstração mostra um método de execução de ações com um processo elevado.Também demonstra como descobrir se um usuário é atualmente um administrador.

Outras dicas

A solicitação de elevação no meio da execução exige que você:

  1. Use um controle COM elevado, que exibirá um prompt
  2. Inicie um segundo processo elevado desde o início.

No .NET, atualmente não há como elevar um processo em execução;você precisa fazer uma das ações de hackeamento acima, mas tudo o que isso faz é dar ao usuário a impressão de que o processo atual está sendo elevado.

A única maneira que consigo pensar para verificar se um caminho é elevado pelo UAC é tentar fazer alguma gravação trivial nele enquanto você está em um estado não elevado, capturar a exceção, elevar e tentar novamente.

Não tenho certeza se isso é de alguma ajuda para você, mas você pode dar uma olhada nesta postagem do blog:

http://haishibai.blogspot.com/2010/01/tiy-try-out-windows-7-uac-using-c-part_26.html

Você pode notificar o usuário de que o caminho está protegido e solicitar que ele envie o arquivo para uma área "mais segura".Dessa forma, seu aplicativo não precisará de elevação.Tenho certeza de que depende de seus usuários e do que você está tentando fazer, no entanto, não acho que seja demais informar ao usuário que você não se sente bem ao despejar xyz na pasta Windows/System32.

Se a sua unidade secundária tiver permissões de arquivo próprias, digamos que você tenha uma outra cópia do Windows instalada nela.Isso irá solicitar.

Ele também perguntará se os arquivos estão em uso, o que às vezes ocorre se você tiver o Windows Explorer aberto no mesmo diretório e o arquivo selecionado com um visualizador de arquivos exibindo o conteúdo...existem algumas outras esquisitices, mas geralmente você é solicitado a fornecer permissão de arquivo se o arquivo estiver em uso ou se for um diretório confidencial.

Se você fizer um loop no FolderBrowserDialog , certifique-se de notificar o usuário sobre o motivo, para que ele não fique bravo com seu aplicativo.

Observação:fede, não há maneira .net de pedir permissão, talvez p/invoque a API win32 ...?

O UAC pode elevar objetos com base em seu GUID, isso (em teoria) significaria que qualquer classe com um GUID pode ser elevada. O UACDemo também deve mostrar como fazer isso

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