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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

Adding file in Solution

Select Application Manifest File

Select Manifest option

Update Manifest file

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

Ответ 6

Во время работы над 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" />

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

Ответ 7

Согласно

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

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

Вы можете создать манифест с помощью настроек безопасности 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" />

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

Ответ 11

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

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

Ответ 12

Вы должны использовать System.Security.Principal и попробовать это:

using System.Security.Principal;
public bool IsAdministrator()
{
    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;
}

Ответ 13

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

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