12 ответов:
вы хотите изменить манифест, который будет встроен в программу. Это работает на Visual Studio 2008 и выше: проект + Добавить новый элемент, выберите "файл манифеста приложения". Измените
<requestedExecutionLevel>элемент to:<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />пользователь получает UAC запрос при запуске программы. Используйте мудро; их терпение может быстро изнашиваться.
добавлять
requestedExecutionLevelэлемент вашего манифеста - это только половина битвы; вы должны помнить, что UAC можно отключить. Если это так, вы должны выполнить проверку по старой школе и создать диалоговое окно с ошибкой, если пользователь не является администратором
(вызовIsInRole(WindowsBuiltInRole.Administrator)на вашем потокеCurrentPrincipal).
я реализовал код, чтобы сделать это вручную:
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).
подробные шаги заключаются в следующем.
- Добавить файл манифеста приложения к решению
- изменить настройки приложения на " приложение.манифест"
- обновить тег "requestedExecutionLevel" для requireAdministrator.
обратите внимание, что с помощью этого кода вам нужно отключите параметры безопасности ClickOnce, для этого перейдите в свойства - > безопасность - > безопасность ClickOnce
во время работы над 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" />чтобы установить приложение для запуска от имени администратора,вы должны выбрать средний.
в Visual Studio 2010 щелкните правой кнопкой мыши имя проекта. Нажмите "Просмотр настроек Windows", это создает и открывает файл под названием " Приложение.проявляться." В этом файле замените "asInvoker "на" requireAdministrator", как описано в комментариях в файле.
по состоянию на
<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); }
это упрощенная версия this ответ
public bool IsUserAdministrator() { try { WindowsIdentity user = WindowsIdentity.GetCurrent(); WindowsPrincipal principal = new WindowsPrincipal(user); return principal.IsInRole(WindowsBuiltInRole.Administrator); } catch (Exception) { return false; } }
вы можете создать манифест с помощью параметров безопасности ClickOnce, а затем отключить его:
Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settingsпосле того, как вы щелкнули его, файл будет создан в папке свойств проекта под названием приложение.манифест как только это будет создано, вы можете снять
Enable ClickOnce Security SettingsопцииОткройте этот файл и измените эту строку :
<requestedExecutionLevel level="asInvoker" uiAccess="false" />to:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />это сделает программу требует прав администратора.
щелкните правой кнопкой мыши исполняемый файл, перейдите в раздел Свойства > совместимость и установите флажок "запустить эту программу от имени администратора".
Если вы хотите запустить его как администратор для всех пользователей, сделайте то же самое в "Изменить настройки для всех пользователей".




Comments