После того, как моя программа установлена на клиентском компьютере, как заставить программу работать в Windows 7 в качестве администратора ?
После того, как моя программа установлена на клиентском компьютере, как заставить программу работать в Windows 7 в качестве администратора ?
Ответы:
Вы захотите изменить манифест, встроенный в программу. Это работает в Visual Studio 2008 и более поздних версиях: Project + Add New Item, выберите «Файл манифеста приложения». Измените <requestedExecutionLevel>
элемент на:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Пользователь получает приглашение UAC при запуске программы. Используйте с умом; их терпение может быстро изнашиваться.
Добавление requestedExecutionLevel
элемента в ваш манифест - это только полдела; Вы должны помнить, что UAC можно отключить. Если это так, вы должны выполнить проверку по-старому и вывести диалоговое окно с сообщением об ошибке, если пользователь не является администратором
(вызовите IsInRole(WindowsBuiltInRole.Administrator)
вашу ветку CurrentPrincipal
).
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
так же
IsInRole
, о котором говорит Андерс.
Подробные шаги заключаются в следующем.
Обратите внимание, что с помощью этого кода вам необходимо отключить настройки безопасности ClickOnce, для этого перейдите в Свойства -> Безопасность -> Безопасность ClickOnce.
New Item...
не вариант в моем проекте службы установки. Как я могу добавить манифест приложения? Я могу добавить его в свой основной проект, но не его установщик.
Я реализовал некоторый код, чтобы сделать это вручную:
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" />
ИЛИ
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
ИЛИ
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Чтобы приложение работало от имени администратора, вам нужно выбрать среднее.
Согласно
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Вы захотите добавить манифест приложения, если у вас его еще нет или вы не знаете, как его добавить. Поскольку некоторые проекты не добавляют автоматически отдельный файл манифеста, сначала перейдите в свойства проекта, перейдите на вкладку « Приложение » и убедитесь, что ваш проект не исключает манифест в нижней части касания.
В Visual Studio 2010 щелкните правой кнопкой мыши имя вашего проекта. Нажмите «View Windows Settings», чтобы создать и открыть файл «app.manifest». В этом файле замените «asInvoker» на «requireAdministrator», как описано в закомментированных разделах файла.
Еще один способ сделать это только в коде - это определить, запущен ли процесс от имени администратора, как в ответе @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 и отсутствием прав администратора, - это остановить выполнение в нужный момент.
Вы можете создать манифест с помощью настроек безопасности 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" />
Это заставит программу требовать прав администратора.
Это упрощенная версия этого ответа , @NG выше
public bool IsUserAdministrator()
{
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch
{
return false;
}
}
Щелкните правой кнопкой мыши по своему исполняемому файлу, выберите «Свойства»> «Совместимость» и установите флажок «Запускать эту программу от имени администратора».
Если вы хотите запустить его как администратор для всех пользователей, сделайте то же самое в «настройке изменений для всех пользователей».