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

617

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

  • 3
    Помимо того, что написал Binary Worrier, вы можете написать некоторый код, чтобы проверить, есть ли у вас права администратора ... (это то, что вы просите?)
  • 35
    Я бы не стал воспринимать эту задачу слегка, вы должны узнать, для чего на самом деле нужен администратор, и посмотреть, сможете ли вы обойти ее. Ни один клиент не будет рад запускать приложение в режиме администратора все время. Многие крупные клиенты даже не будут рассматривать такое приложение, и если тестирование логотипа имеет для вас значение, оно не пройдет так.
Показать ещё 2 комментария
Теги:
administrator
windows-7
elevated-privileges

10 ответов

872
Лучший ответ

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

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

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

  • 28
    Если вы получили ошибку ClickOnce при попытке компиляции, посмотрите этот ответ: stackoverflow.com/questions/11023998/…
  • 14
    Ваш проект также должен быть настроен на использование манифеста приложения - в Свойствах проекта откройте вкладку «Приложение» и убедитесь, что для параметра «Манифест:» в разделе «Ресурсы» задан ваш app.manifest (или как вы его назвали. файл манифеста).
Показать ещё 6 комментариев
125

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

  • 22
    Вы также можете также использовать <requestedExecutionLevel level="highestAvailable" uiAccess="false" />
  • 14
    @MarkKram: Какое отношение имеет наибольший доступный к этому? Вопрос заключается в том, чтобы заставить администратора, наибольший доступный менее ограничен, чем requireAdministrator, и он позволяет пользователю без прав администратора запускать приложение без повышенных прав без запроса UAC, только администраторы получат запрос ...
Показать ещё 1 комментарий
44

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

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;
}
  • 40
    Это только обнаруживает, если контекст работает как Администратор, это не предвещает приложение для запуска от имени Администратора в соответствии с запросом OP
  • 5
    Я не думаю, что есть какой-то программный способ заставить приложение повысить уровень собственной безопасности. Если бы это было, это было бы довольно опасно для безопасности, нет?
Показать ещё 2 комментария
37

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

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

17

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

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

Изображение 1013

Изображение 1014

Изображение 1015

Изображение 1016

14

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

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

  • 0
    Это работает. Однако при запуске приложения CMD появилось пустое окно cmd (с помощью приложения c # cmd для запуска некоторых exe-файлов в фоновом режиме).
10

Согласно

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

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

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

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

  • 6
    Этот ответ о VB.NET :-), а не VS 2010 в целом. Ответы «Добавить новый элемент» о C #. В C ++ вы можете сделать это в настройках проекта.
3

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

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

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

  • 4
    Это не отвечает на вопрос. «Как только моя программа установлена на клиентском компьютере», а не «как мне».
  • 0
    Извините за то, что неясно. Как только ваша программа установлена, измените этот параметр в свойствах вашего исполняемого файла (ваша основная программа, а не установщик). Он хочет заставить свою программу работать от имени администратора.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню