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

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

13 ответов

Решение

Вы захотите изменить манифест, встроенный в программу. Это работает в Visual Studio 2008 и более поздних версиях: Project + Add New Item, выберите "Файл манифеста приложения". Изменить <requestedExecutionLevel> элемент для:

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

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

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

Подробные шаги заключаются в следующем.

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

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

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

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

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

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

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

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;
}

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

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

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

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

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

ИЛИ ЖЕ

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

ИЛИ ЖЕ

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

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

Другой способ сделать это, только в коде, это определить, запущен ли процесс от имени администратора, как в ответе @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);
}

Согласно

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

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

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

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

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

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

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

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

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

чтобы:

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

Это заставит программу требовать прав администратора.

Если по какой-то причине вам нужно решение, состоящее только из кода, вот отдельный файл класса. Просто вызовите 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);              }
    }

Это упрощенная версия этого ответа

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (Exception)
    {
        return false;
    }
}

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

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

Другие вопросы по тегам