Как заставить мое приложение .NET запускаться от имени администратора? - PullRequest
809 голосов
/ 12 мая 2010

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

Ответы [ 12 ]

1059 голосов
/ 12 мая 2010

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

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

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

148 голосов
/ 13 мая 2010

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

55 голосов
/ 12 мая 2017

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

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

Adding file in Solution

Select Application Manifest File

Select Manifest option

Update Manifest file

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

55 голосов
/ 30 августа 2013

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

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;
}
42 голосов
/ 12 мая 2010

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

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

19 голосов
/ 06 марта 2013

При работе в 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" />

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

13 голосов
/ 17 марта 2013

Согласно

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

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

  • Далее, щелкните правой кнопкой мыши проект
  • Добавить новый товар
  • Последнее, найдите и нажмите Файл манифеста приложения
12 голосов
/ 07 сентября 2011

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

9 голосов
/ 12 января 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);
}
8 голосов
/ 05 мая 2018

Это упрощенная версия ответа , написанного @ NG

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