Pergunta

Esta questão se aplica ao Windows Vista!

Eu tenho uma aplicação que funciona normalmente sem privilégios administrativos. Não é uma atividade que faz necessidade privilégio administrativo, mas eu não quero começar o próprio aplicativo com privilégios elevados quando eu sei que a maioria não vai utilizador tempo, mesmo estar usando esse recurso.

Estou pensando em determinado método pelo qual eu possa elevar os privilégios do aplicativo em algum evento (como o pressionar de um botão). Exemplo:

Se o usuário clicar nesse botão, em seguida, ele é solicitado com diálogo UAC ou consentimento. Como posso fazer isso?

Foi útil?

Solução

Eu não acredito que é possível elevar o processo atualmente em execução. Ele é integrado ao Windows Vista que privilégios de administrador são dadas a um processo na inicialização, como eu entendo. Se você olhar para vários programas que utilizam UAC, você deve ver que eles realmente lançar um processo separado cada vez que uma ação administrativa precisa ser executada (Gerenciador de Tarefas é um, Paint.NET é outra, sendo este último um aplicativo .NET na verdade ).

A solução típica para este problema é para especificar argumentos de linha de comando ao iniciar um processo de elevação (sugestão de abatishchev é uma maneira de fazer isso), para que o processo lançado conhece apenas para exibir uma caixa de diálogo certa e saia após este ação foi concluída. Assim, ele deve ser quase imperceptível para o usuário que um novo processo foi lançado e, em seguida, saiu, e prefere aparecer como se uma nova caixa de diálogo dentro do mesmo aplicativo foi aberto (especialmente se você algum hackery para tornar a janela principal do elevada processo de uma criança do processo pai). Se você não precisa de UI para o acesso elevado, melhor ainda.

Para uma discussão completa da UAC no Vista, eu recomendo que você veja isso muito através do artigo sobre o assunto (exemplos de código estão em C ++, mas eu suspeito que você vai precisar usar o WinAPI e P / Invoke para fazer a maioria das coisas em C # qualquer maneira). Esperamos que agora, pelo menos, ver o caminho certo a tomar, embora a concepção de um programa compatível com o UAC está longe de ser trivial ...

Outras dicas

Como foi dito :

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

irá executar o processo como administrador para fazer o que você precisa com o registro, mas o retorno ao seu aplicativo com os privilégios normais.

O seguinte artigo MSDN KB 981778 descreve como 'auto-elevar' um aplicativo:

http://support.microsoft.com/kb/981778

Ele contém amostras para download no Visual C ++, Visual C #, Visual Basic.NET.

Esta abordagem contorna a necessidade de iniciar um processo separado, mas na verdade ele é a aplicação original que é reiniciado, funcionando como um usuário elevados. No entanto, este ainda pode ser muito útil em alguns contextos onde não é prático para duplicar código em um executável separado.

Para remover a elevação, você precisa para sair da aplicação.

Você precisa de um apelido UAC eo código para executar elevada como um objeto COM.

Veja esta questão.

documentação no MSDN.

Talvez alguém vem a calhar este exemplo simples:

using System;
using System.Linq;
using System.Reflection;
using System.Diagnostics;
using System.Security.Principal;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    internal static class Program
    {
        private class Form1 : Form
        {
            internal Form1()
            {
                var button = new Button{ Dock = DockStyle.Fill };
                button.Click += (sender, args) => RunAsAdmin();
                Controls.Add(button);

                ElevatedAction();
            }
        }

        [STAThread]
        internal static void Main(string[] arguments)
        {
            if (arguments?.Contains("/run_elevated_action") == true)
            {
                ElevatedAction();
                return;
            }

            Application.Run(new Form1());
        }

        private static void RunAsAdmin()
        {
            var path = Assembly.GetExecutingAssembly().Location;
            using (var process = Process.Start(new ProcessStartInfo(path, "/run_elevated_action")
            {
                Verb = "runas"
            }))
            {
                process?.WaitForExit();
            }
        }

        private static void ElevatedAction()
        {
            MessageBox.Show($@"IsElevated: {IsElevated()}");
        }

        private static bool IsElevated()
        {
            using (var identity = WindowsIdentity.GetCurrent())
            {
                var principal = new WindowsPrincipal(identity);

                return principal.IsInRole(WindowsBuiltInRole.Administrator);
            }
        }

    }
}

Eu sei que este é um post antigo, mas isso é em resposta a qualquer outra pessoa que se depara com a sugestão de MarcP. O post MSDN ele referenciados, aliás, faz reiniciar as aplicações em todos os exemplos de código. Os exemplos de código usar o runas verbo já proposto em outras sugestões.

Eu transferi o código para ter certeza, mas esta é a partir do artigo do MSDN original:

4. Clique em Sim para aprovar a elevação. Em seguida, o aplicativo original reiniciar, executando como um administrador elevado.
5. Feche a aplicação.

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