Як тільки моя програма встановлена на клієнтській машині, як змусити свою програму працювати як адміністратор в Windows 7?
Як тільки моя програма встановлена на клієнтській машині, як змусити свою програму працювати як адміністратор в Windows 7?
Відповіді:
Вам потрібно змінити маніфест, який вбудовується в програму. Це працює для Visual Studio 2008 і новіших версій: Проект + Додати новий елемент, виберіть "Файл маніфесту програми". Змініть <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 клацніть правою кнопкою миші назву проекту. Натисніть "Переглянути налаштування Windows", це створить і відкриє файл під назвою "app.manifest". У цьому файлі замініть "asInvoker" на "requAdministrator", як пояснено в коментованих розділах файлу.
Інший спосіб зробити це, лише в коді, - виявити, чи процес працює як адміністратор, як у відповіді @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;
}
}
Клацніть правою кнопкою миші свій виконуваний файл, перейдіть до Властивості> Сумісність та встановіть прапорець "Запустити цю програму як адміністратор".
Якщо ви хочете запустити його як адміністратора для всіх користувачів, зробіть те саме, що у "зміні налаштувань для всіх користувачів".