Как заставить мое приложение .NET запускаться от имени администратора?

Как только моя программа будет установлена ​​на клиентском компьютере, как мне заставить ее запускаться от имени администратора в Windows 7?


person Gold    schedule 12.05.2010    source источник
comment
Помимо того, что написал Binary Worrier, вы можете написать код, чтобы проверить, есть ли у вас права администратора ... (это то, о чем вы просите?)   -  person lexu    schedule 12.05.2010
comment
Я бы не стал относиться к этой задаче легкомысленно, вам следует проверить, для чего на самом деле нужен администратор, и посмотреть, сможете ли вы обойти это. Ни один клиент не будет доволен тем, что все время запускает приложение в режиме администратора. Многие крупные клиенты даже не рассматривают подобное приложение, и если тестирование логотипа имеет для вас значение, оно не пройдет.   -  person Alex    schedule 12.05.2010
comment
Алекс очень прав. Если возможно, повышайте только при необходимости, в противном случае в игру вступят групповая политика, UAC и ряд других переменных. По крайней мере, с UAC пользователь должен будет авторизоваться при каждом запуске, а не только при выполнении определенного действия пользователя.   -  person Anthony Mason    schedule 11.11.2016
comment
Правильный способ - встроить файл манифеста в ваше приложение.   -  person Elmue    schedule 03.10.2019


Ответы (13)


Вы захотите изменить манифест, который встроен в программу. Это работает в Visual Studio 2008 и выше: Project + Добавить новый элемент, выберите «Файл манифеста приложения». Измените элемент <requestedExecutionLevel> на:

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Пользователь получает приглашение UAC при запуске программы. Используйте с умом; их терпение может быстро истощиться.

person Hans Passant    schedule 12.05.2010
comment
Если при попытке компиляции вы получаете ошибку ClickOnce, см. Следующий ответ: stackoverflow.com/questions/11023998/ - person SSS; 02.12.2013
comment
Ваш проект также должен быть настроен для использования манифеста приложения - в «Свойствах проекта» откройте вкладку «Приложение» и убедитесь, что для параметра «Манифест: в разделе« Ресурсы »установлено значение вашего app.manifest (или того, что вы назвали для файла .manifest). - person Victor Chelaru; 12.04.2016
comment
Мне пришлось перезагрузить проект, прежде чем VS предложит мне перезапустить в режиме администратора. - person Jon; 28.02.2017
comment
Обратите внимание, что это не заставит программу запускаться от имени администратора. UAC можно отключить. Фактически, ничто не может принудительно запускать программу под определенной учетной записью пользователя. - person Alejandro; 03.04.2018
comment
@Alejandro - Да, UAC можно отключить, но в этом случае приложение будет автоматически запускаться от имени администратора (при условии, что у вашего пользователя есть права администратора), потому что отключение UAC означает, что все работает с наивысшими привилегиями, которые разрешены пользователю. Это все равно что жаловаться на то, что если вы установите на дверь необычный замок, он не сработает, если дверь будет снята. - person Erik Funkenbusch; 05.05.2018
comment
@ErikFunkenbusch Он не будет запускаться автоматически от имени администратора, он будет работать с обычными разрешениями пользователя (admin, если пользователь является администратором, или стандартным, если пользователь стандартный). Полагаться на этот конкретный случай, даже если он установлен по умолчанию, - вот чего хорошие программы избегают, как чумы. Следуя вашей аналогии, необычный замок хорош и все такое, но правильно разработанное программное обеспечение должно предвидеть случай, когда вся дверь будет удалена, даже если это редкое явление. - person Alejandro; 05.05.2018
comment
Ответ @SSS больше не работает для VS 2017. ClickOnce всегда проверяется при публикации, и результат невозможно опубликовать. - person vee; 22.01.2019
comment
Для франкоговорящих разработчиков вариант - Fichier manifesteste de l'application. - person peter.cyc; 30.07.2020

Добавление элемента requestedExecutionLevel в ваш манифест - это только половина дела; вы должны помнить, что UAC можно отключить. Если это так, вы должны выполнить проверку по старинке и отобразить диалоговое окно с сообщением об ошибке, если пользователь не является администратором
(вызовите _ 2_ в CurrentPrincipal вашей ветки).

person Anders    schedule 13.05.2010
comment
Вы также можете использовать <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> - person Mark Kram; 14.08.2011
comment
@MarkKram: При чем здесь highAvailable? Вопрос в том, чтобы заставить администратора, highAvailable менее ограничен, чем requireAdministrator, и позволит пользователю без прав администратора запускать приложение без повышенных прав без запроса UAC, только администраторы будут получать запрос ... - person Anders; 17.09.2013
comment
Вот пример MSDN IsInRole , О чем говорит Андерс. - person Uwe Keim; 16.06.2015
comment
Я больше не помню точных деталей, но думаю, это зависит от того, что вы имеете в виду под инвалидом. Перемещение ползунка UAC полностью вниз - это не то же самое, что отключение UAC (кроме Vista). Если UAC полностью отключен, весь механизм уровня целостности отключен, и доступна только классическая функция runas.exe из 2000 / XP. Проверка роли администратора обрабатывает случай runas.exe. - person Anders; 20.08.2019
comment
Похоже, что пользователь должен быть либо администратором, который был понижен в должности после отключения UAC (с помощью ползунка UAC или реестра), либо обычным пользователем, который запускал regedit с учетными данными администратора, чтобы установить для EnableLUA значение 0 (обычный пользователь не может перемещать UAC Ползунок вниз, даже с помощью администратора), чтобы запустить exe, который указывает level = requireAdministrator, без запроса. - person Tal Aloni; 21.08.2019
comment
Я установил EnableLUA на 0 на Server 2008 R2 и удалил себя из группы администраторов, перезагрузился, и теперь exe, который указывает level = requireAdministrator, запускается без каких-либо запросов. - person Tal Aloni; 21.08.2019

Подробные шаги следующие.

  1. Добавить файл манифеста приложения в проект
  2. Измените настройку приложения на app.manifest
  3. Обновите тег requiredExecutionLevel до requireAdministrator.

Добавление файла в решение

Выберите файл манифеста приложения

Выберите вариант манифеста

Обновить файл манифеста

Обратите внимание, что с помощью этого кода вам необходимо отключить настройки безопасности ClickOnce, для этого перейдите в Свойства - ›Безопасность -› Безопасность ClickOnce.

person Hassan Rahman    schedule 12.05.2017
comment
New Item... не входит в мой проект службы установщика. Как мне добавить манифест приложения? Я могу добавить его в свой основной проект, но не в установщик. - person HackSlash; 26.03.2020

Я реализовал код, чтобы сделать это вручную:

using System.Security.Principal;
public bool IsUserAdministrator()
{
    bool isAdmin;
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (UnauthorizedAccessException ex)
    {
        isAdmin = false;
    }
    catch (Exception ex)
    {
        isAdmin = false;
    }
    return isAdmin;
}
person NG.    schedule 30.08.2013
comment
Это только определяет, запущен ли контекст как Admin, он не требует, чтобы приложение запускалось как Admin, как того требует OP. - person Matt Wilko; 05.12.2013
comment
Я не думаю, что существует какой-либо программный способ заставить приложение повышать свою собственную перманентность. Если бы это было так, это было бы серьезной угрозой безопасности, не так ли? - person Mark Richman; 18.08.2014
comment
Хотя ваше решение хорошее, но вопрос был другим. ;) - person Yash; 25.07.2015
comment
см. обновленную версию этого метода здесь stackoverflow.com/a/50186997 (субъективно) - person Hakan Fıstık; 03.12.2018
comment
Это не ответ на вопрос! - person Elmue; 03.10.2019

Вы можете встроить файл манифеста в EXE-файл, чтобы Windows (7 или выше) всегда запускала программу от имени администратора.

Более подробную информацию можно найти в Шаг 6. Создание и внедрение манифеста приложения ( UAC) (MSDN).

person David    schedule 12.05.2010

Во время работы над Visual Studio 2008 щелкните правой кнопкой мыши Project -> Add New Item и затем выберите Application Manifest File.

В файле манифеста вы найдете тег requestedExecutionLevel, и вы можете установить уровень до трех значений:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

OR

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

OR

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

Чтобы ваше приложение запускалось от имени администратора, вы должны выбрать средний.

person Rashad Maqsood    schedule 06.03.2013
comment
Это работает. Однако при запуске приложения CMD появлялось пустое окно cmd (с помощью приложения c # cmd для запуска некоторого exe в фоновом режиме). - person W.M.; 18.10.2017

Другой способ сделать это, только в коде, - определить, запущен ли процесс от имени администратора, как в ответе @NG. . А затем снова откройте приложение и закройте текущее.

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

Обратите внимание, что в приведенном ниже коде NeedsToRunAsAdmin - это метод, который определяет, требуются ли в текущих условиях права администратора. Если это вернет false, код не поднимется. Это главное преимущество этого подхода перед другими.

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

private static void Main(string[] args)
{
    if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
    {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = Environment.CurrentDirectory;
        proc.FileName = Assembly.GetEntryAssembly().CodeBase;

        foreach (string arg in args)
        {
            proc.Arguments += String.Format("\"{0}\" ", arg);
        }

        proc.Verb = "runas";

        try
        {
            Process.Start(proc);
        }
        catch
        {
            Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
        }
    }
    else
    {
        //Normal program logic...
    }
}

private static bool IsRunAsAdmin()
{
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(id);

    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
person TheLethalCoder    schedule 12.01.2017
comment
+1 за подход, основанный только на коде. Обратите внимание, что вам нужно включить UAC, чтобы иметь возможность запускать что-либо с runas в качестве администратора от пользователя без прав администратора, в противном случае он откроется без сообщений с текущими разрешениями пользователя (проверено в Windows 7 64 бит). Насколько я могу судить, единственное, что вы можете сделать с отключенным UAC и отсутствующим правом администратора, - это остановить выполнение в нужный момент. - person reallynice; 09.08.2019

Согласно

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

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

  • Затем щелкните правой кнопкой мыши проект
  • Добавить новый элемент
  • Наконец, найдите и щелкните Файл манифеста приложения
person Justin Mcconnell    schedule 17.03.2013

В Visual Studio 2010 щелкните правой кнопкой мыши имя проекта. Нажмите «Просмотр настроек Windows», это сгенерирует и откроет файл с именем «app.manifest». В этом файле замените asInvoker на requireAdministrator, как описано в прокомментированных разделах файла.

person Evolved    schedule 07.09.2011
comment
Этот ответ касается VB.NET :-), а не VS 2010 в целом. Ответы на добавление нового элемента относятся к C #. В C ++ это можно сделать в настройках проекта. - person Philm; 09.08.2013

Вы можете создать манифест с помощью настроек безопасности ClickOnce, а затем отключить его:

Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings

После того, как вы щелкнете по нему, в папке свойств проекта будет создан файл под названием app.manifest. После его создания вы можете снять флажок Enable ClickOnce Security Settings.

Откройте этот файл и измените эту строку:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

to:

 <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

Это потребует для программы прав администратора.

person Yochai Timmer    schedule 14.02.2018

ЭТО НЕ ПРИНУЖДАЕТ ПРИЛОЖЕНИЕ РАБОТАТЬ В КАЧЕСТВЕ АДМИНИСТРАТОРА.
Это упрощенная версия this ответ, вверху от @NG

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch
    {
        return false;
    }
}
person Hakan Fıstık    schedule 05.05.2018
comment
Это не ответ на вопрос! - person Elmue; 03.10.2019
comment
@Elmue более логично добавить свой комментарий к исходному ответу, который я только что отредактировал, вы можете найти ссылку на этот ответ в моем. - person Hakan Fıstık; 03.10.2019

Если по какой-то причине вам нужно решение, состоящее только из кода, просто вызовите AdminRelauncher.RelaunchIfNotAdmin () при запуске:

using System;
using System.Diagnostics;
using System.Reflection;
using System.Security.Principal;

public static class AdminRelauncher
{
    public static void RelaunchIfNotAdmin()
    {
        if (!RunningAsAdmin())
        {
            Console.WriteLine("Running as admin required!");
            ProcessStartInfo proc = new ProcessStartInfo();
            proc.UseShellExecute = true;
            proc.WorkingDirectory = Environment.CurrentDirectory;
            proc.FileName = Assembly.GetEntryAssembly().CodeBase;
            proc.Verb = "runas";
            try
            {
                Process.Start(proc);
                Environment.Exit(0);
            }
            catch (Exception ex)
            {
                Console.WriteLine("This program must be run as an administrator! \n\n" + ex.ToString());
                Environment.Exit(0);
            }
        }
    }

    private static bool RunningAsAdmin() 
    {
        WindowsIdentity id = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(id);

        return principal.IsInRole(WindowsBuiltInRole.Administrator);              }
    }
person Gaspa79    schedule 04.03.2021

Щелкните правой кнопкой мыши исполняемый файл, выберите «Свойства»> «Совместимость» и установите флажок «Запускать эту программу от имени администратора».

Если вы хотите запустить его от имени администратора для всех пользователей, сделайте то же самое в «изменить настройки для всех пользователей».

person SlickJayD    schedule 27.03.2014
comment
Это не отвечает на вопрос. После того, как моя программа установлена ​​на клиентском компьютере, не как я. - person Joe; 27.03.2014
comment
Извините за непонятность. После установки программы измените этот параметр в свойствах исполняемого файла (основной программы, а не установщика). Он действительно хочет заставить свою программу запускаться от имени администратора. - person SlickJayD; 27.03.2014
comment
Лучше установить требование администратора в манифесте. Я бы сказал, что это отвечает на вопрос, но едва ли. - person BradleyDotNET; 02.09.2014
comment
@Joe Честно говоря, принятый ответ не отвечает на вопрос OP, поскольку требует переустановки приложения exe. Это вряд ли решение, если моя программа будет установлена. Во всяком случае, этот отрицательный ответ более правильный, чем принятый, поэтому я не понимаю, почему этот ответ набрал 400+ голосов. - person NickG; 07.11.2014
comment
Собственно, он отлично отвечает на оба вопроса. Мало шансов изменить манифест после установки, и программы не должны пытаться повысить свои разрешения после запуска - во многих средах - это хороший путь к тому, чтобы называться вредоносным ПО. Для большинства компаний этот ответ является лучшим, потому что он возлагает ответственность на пользователя и его права. Я пишу много кода, который не могу ни увидеть, ни запустить, когда он находится в производстве. Старайтесь не быть умнее, чем ваши собственные соображения безопасности. - person jinzai; 20.12.2017