Подача заявки повышенным UAC - PullRequest
11 голосов
/ 20 июня 2011

У меня есть приложение, которому требуется повышение уровня UAC.

У меня есть код, который позволяет мне дать это, но приложение открывается дважды ... что является проблемой ..

так вот код в Form1:

 public Form1()
    {
        InitializeComponent();

        WindowsPrincipal pricipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
        bool hasAdministrativeRight = pricipal.IsInRole(WindowsBuiltInRole.Administrator);           

        if (!hasAdministrativeRight)
        {
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.UseShellExecute = true;
            startInfo.WorkingDirectory = Environment.CurrentDirectory;
            startInfo.FileName = Application.ExecutablePath;
            startInfo.Verb = "runas";
            try
            {
                Process p = Process.Start(startInfo);
            }
            catch (System.ComponentModel.Win32Exception ex)
            {
                return;
            }

        }

    }

и это код программы .cs

       static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

при отладке я обнаружил, что сначала он выполняется

Процесс p = Process.Start (startInfo);

, который открывает диалоговое окно повышения прав UAC приложения, а затем открывает приложение

но затем он переходит к

Application.Run (новая Form1 ());

в main () и снова открывает приложение.

Я не хочу, чтобы оно снова открывало приложение ...

Я новичок в этом, есть ли что-то, что я делаю неправильно, и нужно ли мне закрывать UAC после его открытия ..

спасибо

Ответы [ 5 ]

29 голосов
/ 20 июня 2011

Вам не нужно вмешиваться во все это, чтобы убедиться, что ваше приложение всегда работает с повышенными привилегиями. Вы можете просто добавить манифест приложения , который инструктирует Windows для запуска вашего приложения с повышенными правами, и появится запрос UAC без необходимости написания одной строки кода.

Есть связанный вопрос с ответом, который также описывает, как добавить манифест здесь: Как я могу встроить манифест приложения в приложение с использованием VS2008?

3 голосов
/ 20 июня 2011

Этот является гораздо лучшим подходом, когда известно, что вашему приложению с самого начала требуются права администратора.

3 голосов
/ 20 июня 2011

Повышение ваших привилегий всегда будет начинать новый процесс.Обойти это невозможно, кроме как начать с повышенных привилегий в первую очередь, установив в своем приложении требования администратора.Что вы можете сделать, это закрыть приложение сразу после запуска процесса с повышенными правами, чтобы у вас работало только одно приложение.

Этот сценарий можно использовать для приложений, которым требуется повышение только определенных частей их функций, напримеравтоматически обновляемый установщик, которому нужен доступ к программным файлам, а не тот, который требует административного доступа постоянно.

2 голосов
/ 06 января 2016

Переместите код WindowsPrincipal из вашей формы в Program.cs, как в примере ниже. Это запросит у пользователя полномочия UAC до запуска любых форм и запустит форму только в том случае, если полномочия UAC предоставлены.

        static void Main()
        {
            WindowsPrincipal pricipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
            bool hasAdministrativeRight = pricipal.IsInRole(WindowsBuiltInRole.Administrator);

            if (!hasAdministrativeRight)
            {
                ProcessStartInfo startInfo = new ProcessStartInfo();
                startInfo.UseShellExecute = true;
                startInfo.WorkingDirectory = Environment.CurrentDirectory;
                startInfo.FileName = Application.ExecutablePath;
                startInfo.Verb = "runas";
                try
                {
                    Process p = Process.Start(startInfo);
                    Application.Exit();
                }
                catch (System.ComponentModel.Win32Exception ex)
                {
                    MessageBox.Show("This utility requires elevated priviledges to complete correctly.", "Error: UAC Authorisation Required", MessageBoxButtons.OK);
//                    Debug.Print(ex.Message);
                    return;
                }
            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
0 голосов
/ 31 мая 2018

Существует пример от Microsoft, который демонстрирует, как проверить уровень привилегий текущего процесса и как самостоятельно поднять процесс, дав явное согласие с пользовательским интерфейсом согласия.

UAC само поднятие (CSUACSelfElevation)

...