Как только моя программа будет установлена на клиентском компьютере, как мне заставить ее запускаться от имени администратора в Windows 7?
Как заставить мое приложение .NET запускаться от имени администратора?
Ответы (13)
Вы захотите изменить манифест, который встроен в программу. Это работает в Visual Studio 2008 и выше: Project + Добавить новый элемент, выберите «Файл манифеста приложения». Измените элемент <requestedExecutionLevel>
на:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Пользователь получает приглашение UAC при запуске программы. Используйте с умом; их терпение может быстро истощиться.
Добавление элемента requestedExecutionLevel
в ваш манифест - это только половина дела; вы должны помнить, что UAC можно отключить. Если это так, вы должны выполнить проверку по старинке и отобразить диалоговое окно с сообщением об ошибке, если пользователь не является администратором
(вызовите _ 2_ в CurrentPrincipal
вашей ветки).
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
- person Mark Kram; 14.08.2011
IsInRole
, О чем говорит Андерс.
- person Uwe Keim; 16.06.2015
Подробные шаги следующие.
- Добавить файл манифеста приложения в проект
- Измените настройку приложения на app.manifest
- Обновите тег requiredExecutionLevel до requireAdministrator.
Обратите внимание, что с помощью этого кода вам необходимо отключить настройки безопасности ClickOnce, для этого перейдите в Свойства - ›Безопасность -› Безопасность ClickOnce.
New Item...
не входит в мой проект службы установщика. Как мне добавить манифест приложения? Я могу добавить его в свой основной проект, но не в установщик.
- person HackSlash; 26.03.2020
Я реализовал код, чтобы сделать это вручную:
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" />
OR
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
OR
<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);
}
runas
в качестве администратора от пользователя без прав администратора, в противном случае он откроется без сообщений с текущими разрешениями пользователя (проверено в Windows 7 64 бит). Насколько я могу судить, единственное, что вы можете сделать с отключенным UAC и отсутствующим правом администратора, - это остановить выполнение в нужный момент.
- person reallynice; 09.08.2019
Согласно
<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" />
to:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Это потребует для программы прав администратора.
ЭТО НЕ ПРИНУЖДАЕТ ПРИЛОЖЕНИЕ РАБОТАТЬ В КАЧЕСТВЕ АДМИНИСТРАТОРА.
Это упрощенная версия this ответ, вверху от @NG
public bool IsUserAdministrator()
{
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch
{
return 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); }
}
Щелкните правой кнопкой мыши исполняемый файл, выберите «Свойства»> «Совместимость» и установите флажок «Запускать эту программу от имени администратора».
Если вы хотите запустить его от имени администратора для всех пользователей, сделайте то же самое в «изменить настройки для всех пользователей».