Форум программистов, компьютерный форум, киберфорум
Наши страницы
LapisAlchemist
Войти
Регистрация
Восстановить пароль
Рейтинг: 4.90. Голосов: 10.

Запуск программы на C# с правами администратора

Запись от LapisAlchemist размещена 08.04.2012 в 17:05
Метки c-sharp

Довольно часто встречаются на форумах программистов подобные темы. Решения предлагают разные, одни работают, другие нет.

Описанный ниже способ запуска программы с правами администратора основан на одном примере, найденном мной на просторах Интернета. Он прекрасно работает на C#. На VB.NET, возможно, будет немного другая реализация, но, как правило, профессиональные программы создаются именно на C (C, C++, C# и т. д.), IMHO.

Рассмотрим теорию: при старте программы, естественно, нужно проверить, с какими правами она запущена, т. к. пользователь может открыть программу, выбрав в контекстном меню Проводника пункт "Запуск с правами администратора". Далее, если программа имеет обычные права, запустить новую копию программы уже с правами администратора и завершить текущую; иначе просто начинать работу.

В C# (проекты типа Windows Forms) программа практически начинает работу с кода, записанного в файле Program.cs. По умолчанию он имеет такой вид (вместо Form1() может быть написано имя формы, которая в проекте была создана первой):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
Здесь присутствует единственная процедура Main, с которой программа начинает работу. По сути, самой главной является последняя строка -- происходит непосредственно старт программы. Метод Application.Run() принимает в качестве аргумента новый экземпляр класса-формы.

Немного не по теме, но пригодится
Вместо Form1 можно указать новый экземпляр любой другой формы, входящей в пространство имен текущего проекта, т. е. созданной в этом проекте. Таким образом, можно задать, с какой формы программа начинает работу (в VB.NET это можно сделать в свойствах проекта)


Логично, что проверку имеющихся у программы прав можно выполнить в самом начале этой процедуры, а три имеющихся строки выполнять только в том случае, если программа имеет права администратора.

Итак, проверка имеющихся у приложения прав выполняется так:
C#
1
2
3
4
using System.Security.Principal;
 
    WindowsPrincipal pricipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
    bool hasAdministrativeRight = pricipal.IsInRole(WindowsBuiltInRole.Administrator);
В результате выполнения переменная hasAdministrativeRight будет иметь значение true, если программа имеет права администратора, и false, если не имеет.

Значит, если переменная имеет значение true, нужно выполнять программу, иначе запустить новую копию с правами администратора. Последнее делается так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System.ComponentModel;
using System.Diagnostics;
 
    ProcessStartInfo processInfo = new ProcessStartInfo(); //создаем новый процесс
    processInfo.Verb = "runas"; //в данном случае указываем, что процесс должен быть запущен с правами администратора
    processInfo.FileName = Application.ExecutablePath; //указываем исполняемый файл (программу) для запуска
    try
    {
        Process.Start(processInfo); //пытаемся запустить процесс
    }
    catch (Win32Exception)
    {
        //Ничего не делаем, потому что пользователь, возможно, нажал кнопку "Нет" в ответ на вопрос о запуске программы в окне предупреждения UAC (для Windows 7)
    }
    Application.Exit(); //закрываем текущую копию программы (в любом случае, даже если пользователь отменил запуск с правами администратора в окне UAC)
А теперь объединим все, что написано выше. И получим примерно такой файл Program.cs:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Security.Principal;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            WindowsPrincipal pricipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
            bool hasAdministrativeRight = pricipal.IsInRole(WindowsBuiltInRole.Administrator);
 
            if (hasAdministrativeRight == false)
            {
                ProcessStartInfo processInfo = new ProcessStartInfo(); //создаем новый процесс
                processInfo.Verb = "runas"; //в данном случае указываем, что процесс должен быть запущен с правами администратора
                processInfo.FileName = Application.ExecutablePath; //указываем исполняемый файл (программу) для запуска
                try
                {
                    Process.Start(processInfo); //пытаемся запустить процесс
                }
                catch (Win32Exception)
                {
                    //Ничего не делаем, потому что пользователь, возможно, нажал кнопку "Нет" в ответ на вопрос о запуске программы в окне предупреждения UAC (для Windows 7)
                }
                Application.Exit(); //закрываем текущую копию программы (в любом случае, даже если пользователь отменил запуск с правами администратора в окне UAC)
            }
            else //имеем права администратора, значит, стартуем
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
        }
    }
}
Вот, собственно, и все. Я использую этот код в одной из своих программ, и она (программа) прекрасно работает.
Размещено в Без категории
Просмотров 22289 Комментарии 6
Всего комментариев 6
Комментарии
  1. Старый комментарий
    Добротненько. А что за псевдоним "runas" ?
    Запись от silicium размещена 08.04.2012 в 23:19 silicium вне форума
  2. Старый комментарий
    Аватар для LapisAlchemist
    Цитата:
    Сообщение от silicium Просмотреть комментарий
    Добротненько. А что за псевдоним "runas" ?
    В данном случае кодом
    C#
    1
    
    ProcessInfo.Verb = "runas";
    мы "указываем" системе, что процесс-программу нужно запустить с правами администратора. То есть если не писать эту строку, программа запустится с обычными правами. Этот параметр специфичен для файлов-программ (*.exe) и вообще для тех файлов, у которых в контекстном меню Проводника есть пункт "Запуск с правами администратора" .

    А вообще свойству Verb присваивают значение в зависимости от типа файла, который открывается запускаемым процессом. Возможные параметры-значения содержатся в свойстве Verbs того же ProcessStartInfo. Если открывать текстовый файл, то можно указать Verb равным "Print", тогда файл будет выведен на принтер по умолчанию.

    Про свойство Verb написано на MSDN:http://msdn.microsoft.com/en-us/libr...info.verb.aspx.
    Запись от LapisAlchemist размещена 09.04.2012 в 22:09 LapisAlchemist вне форума
  3. Старый комментарий
    Интересное название свойства просто.
    Подозреваю, что в startInfo.Arguments можно указать любого пользователя
    Запись от silicium размещена 10.04.2012 в 10:31 silicium вне форума
  4. Старый комментарий
    Аватар для OwenGlendower
    Для программ под Windows Vista и выше лучше использовать манифест приложения (app.manifest) со строкой
    XML
    1
    
    <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
    Запись от OwenGlendower размещена 23.03.2015 в 03:17 OwenGlendower вне форума
  5. Старый комментарий
    С какой версии появилась такая функция?
    Запись от silicium размещена 30.03.2015 в 18:04 silicium вне форума
  6. Старый комментарий
    Аватар для tezaurismosis
    Цитата:
    Сообщение от silicium
    С какой версии появилась такая функция?
    http://stackoverflow.com/a/2818776
    Цитата:
    Сообщение от Hans Passant
    This works on VS2008 and higher
    Запись от tezaurismosis размещена 06.04.2015 в 15:22 tezaurismosis вне форума
    Обновил(-а) tezaurismosis 06.04.2015 в 15:23
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru