Як змусити свою програму .NET запускатись як адміністратор?


875

Як тільки моя програма встановлена ​​на клієнтській машині, як змусити свою програму працювати як адміністратор в Windows 7?


3
Крім того, що написав Binary Worrier, ви можете написати код для перевірки, якщо у вас є права адміністратора .. (це те, про що ви просите?)
lexu

38
Я б не ставився до цього завдання злегка, ви повинні уточнити, для чого йому насправді потрібен адміністратор, і подивитися, чи можете ви його обійти. Жоден клієнт не буде радий постійно працювати з додатком в режимі адміністратора. Багато великих клієнтів навіть не розглядають подібний додаток, і якщо тестування логотипу має значення для вас, воно не пройде так.
Олексій

2
Алекс дуже важливий. Якщо можливо, піднімайте лише при необхідності, інакше в гру вступають групова політика, UAC та ряд інших змінних. Принаймні, з UAC користувачеві доведеться авторизуватись на кожному запуску, на відміну від лише тоді, коли виконується певна дія користувача.
Ентоні Мейсон

Правильний спосіб - вставити файл маніфесту у вашу програму.
Елмуе

Відповіді:


1144

Вам потрібно змінити маніфест, який вбудовується в програму. Це працює для Visual Studio 2008 і новіших версій: Проект + Додати новий елемент, виберіть "Файл маніфесту програми". Змініть <requestedExecutionLevel>елемент на:

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

Користувач отримує підказку UAC під час запуску програми. Використовуйте розумно; їх терпіння може швидко зношитися.


33
Якщо ви отримуєте помилку ClickOnce при спробі компіляції, дивіться цю відповідь: stackoverflow.com/questions/11023998/…
SSS

17
Ваш проект має бути налаштований і на використання маніфесту програми - у Властивості проекту перейдіть на вкладку "Застосування" та переконайтесь, що "Маніфест:" у розділі "Ресурси" встановлено на ваш app.manifest (або що ви назвали. файл маніфесту).
Віктор Челару

7
Мені довелося перезавантажити проект до того, як VS запропонує мені перезапуститись у режимі адміністратора.
Джон

3
@Alejandro - Так, UAC можна відключити, але коли це станеться, додаток автоматично запуститься як адміністратор (якщо припустити, що ваш користувач має права адміністратора), оскільки відключення UAC означає, що все працює за найвищою привілеєм, яку користувач дозволений. Це неначе скаржитися, що якщо встановити на дверцята фантазійний замок, він не спрацює, якщо двері зняти.
Ерік Функенбуш

4
@ErikFunkenbusch Він не "автоматично працюватиме як адміністратор", він запускатиметься під звичайними дозволами користувача (адміністратор, якщо користувач адміністратор, або стандартний, якщо користувач стандартний). Покладаючись на цей конкретний випадок, навіть якщо це за замовчуванням, - це те, що хороші програми уникнуть, як чума. За вашою аналогією, фантазійний замок є приємним і всім, але правильно розроблене програмне забезпечення повинно передбачити випадок усунення всієї двері, навіть якщо це рідкісне явище.
Алехандро

154

Додавання requestedExecutionLevelелемента до маніфесту - це лише половина битви; ви повинні пам'ятати, що UAC можна вимкнути. Якщо це так, вам потрібно виконати перевірку старої шкільної форми та встановити діалогове вікно помилок, якщо користувач не адміністратор
(зателефонуйте IsInRole(WindowsBuiltInRole.Administrator)у свій потік CurrentPrincipal).


22
Крім того, можна використовувати <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> так само
Відзначити Kram

18
@MarkKram: Що стосується цього має найвищий рівень доступності? Питання про примушення адміністратора, найвищий рівень обмеженості доступний менш обмежувальний, ніж requAdministrator, і дозволить користувачеві, який не адміністратор, запускає додаток без підвищеного рівня без підказки UAC, тільки адміністратори отримають запит ...
Anders

3
Ось приклад MSDNIsInRole , про який говорить Андерс.
Уве Кейм

Точних деталей я вже не пам’ятаю, але думаю, це залежить від того, що ви маєте на увазі під інвалідом. Поставити "повзунок UAC" до кінця - це не те саме, що відключити UAC (за винятком Vista). Якщо UAC повністю відключений, весь механізм рівня цілісності відключений, і доступна лише класична функція runas.exe з 2000 / XP. Перевірка ролі адміністратора обробляє справу runas.exe.
Андерс

1
Я встановив EnableLUA на 0 на сервері 2008 R2 і видалив себе з групи адміністраторів, перезавантажився, і тепер exe, який визначає рівень = "needAdministrator", працює без будь-якого
Tal Aloni

86

Детальні кроки наведені нижче.

  1. Додайте файл до маніфесту програми
  2. Змініть налаштування програми на "app.manifest"
  3. Оновіть тег "просятьExecutionLevel", щоб вимагатиАдміністратора.

Додавання файлу в рішення

Виберіть файл програми Manifest File

Виберіть параметр Manifest

Оновити файл Manifest

Зауважте, що за допомогою цього коду потрібно вимкнути параметри безпеки ClickOnce, для цього зайти всередину Властивості -> Захист -> Захист ClickOnce


New Item...не є варіантом у моєму проекті служби встановлення. Як би я поступив над додаванням маніфесту програми? Я можу додати його до свого основного проекту, але це не інсталятор.
HackSlash

61

Я реалізував деякий код, щоб зробити це вручну:

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;
}

45
Це виявляє, якщо контекст працює як адміністратор, він не виключає, що програма запускатиметься як адміністратор, як цього вимагає ОП
Метт Вілько

5
Я не думаю, що існує якийсь програмний спосіб змусити програму підвищити власні візи. Якби вони були, це був би цілком ризик для безпеки, ні?
Марк Річман

6
Хоча ваше рішення добре, але питання було іншим. ;)
Яш

дивіться оновлену версію цього методу тут stackoverflow.com/a/50186997 (суб'єктивно)
Hakan Fıstık

Це не відповідає на питання!
Елмуе


19

Працюючи над 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" />

Щоб ваша програма запускалася як адміністратор, ви повинні вибрати середню.


Це працює. Однак під час запуску програми CMD з'явилося порожнє вікно cmd (за допомогою програми c # cmd для запуску деяких файлів у фоновому режимі).
WM

13

Згідно

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

ви хочете додати маніфест програми, якщо у вас його ще немає або не знаєте, як додати його. Оскільки деякі проекти не додають автоматично окремий файл маніфесту, спочатку перейдіть до властивостей проекту, перейдіть на вкладку « Прикладні програми » та перевірте, чи не виключає ваш проект маніфест у нижній частині крана.

  • Далі клацніть правою кнопкою миші проект
  • Додати новий елемент
  • Нарешті, знайдіть та натисніть Файл маніфесту програми

12

У Visual Studio 2010 клацніть правою кнопкою миші назву проекту. Натисніть "Переглянути налаштування Windows", це створить і відкриє файл під назвою "app.manifest". У цьому файлі замініть "asInvoker" на "requAdministrator", як пояснено в коментованих розділах файлу.


6
Ця відповідь стосується VB.NET :-), а не VS 2010 загалом. Відповіді "Додати новий елемент" стосуються C #. У C ++ ви можете це зробити в налаштуваннях проекту.
Філм

12

Інший спосіб зробити це, лише в коді, - виявити, чи процес працює як адміністратор, як у відповіді @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);
}

1
+1 для підходу лише для коду. Зауважте, що вам потрібен UAC з можливістю запускати що-небудь із runasадміністратором від користувача, який не є адміністратором, інакше він відкриється безшумно з поточними дозволами користувача (перевірено на Windows 7 64 біт). Наскільки я можу сказати, єдине, що ви можете зробити з відключеним UAC, а права адміністратора відсутні, - це припинити виконання в належний момент.
realnice

9

Ви можете створити маніфест за допомогою параметрів безпеки 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" />

Це змусить програми вимагати права адміністратора.


7

Це спрощена версія цієї відповіді , наведеної вище @NG

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch
    {
        return false;
    }
}

1
Це не відповідає на питання!
Elmue

@Elmue, більш логічно додати ваш коментар до оригінальної відповіді, що я щойно відремонтував, ви можете знайти посилання на цю відповідь у моїй.
Hakan Fıstık

-3

Клацніть правою кнопкою миші свій виконуваний файл, перейдіть до Властивості> Сумісність та встановіть прапорець "Запустити цю програму як адміністратор".

Якщо ви хочете запустити його як адміністратора для всіх користувачів, зробіть те саме, що у "зміні налаштувань для всіх користувачів".


4
Це не відповідає на запитання. "Після встановлення моєї програми на клієнтській машині", а не "як мені".
Джо

Вибачте за незрозумілість. Після встановлення вашої програми змініть це налаштування у властивостях виконуваного файлу (основна програма, а не інсталятор). Він хоче змусити свою програму працювати адміністратором.
SlickJayD

2
Краще встановити вимогу адміністратора в маніфесті. Я б стверджував, що це відповідає на питання, але ледве.
BradleyDotNET

3
@Joe Якщо чесно, прийнята відповідь не відповідає на питання ОП, оскільки вимагає перевстановити програму exe. Навряд чи є рішення для "Після встановлення моєї програми". Якщо що-небудь, ця відповідна відповідь є правильнішою, ніж прийнята відповідь, тому я не розумію, чому за цю відповідь 400 голосів.
NickG

Насправді він відповідає на обидва питання чудово. Немало шансів змінити маніфест після встановлення, і програми не повинні намагатися підвищити свої дозволи після запуску - у багатьох середовищах - це хороший шлях до виклику шкідливих програм. У більшості компаній - ця відповідь найкраща, оскільки вона ставить перед користувачем та їхніми дозволами. Я пишу багато коду, який не можу ні "побачити", ні запустити, коли він буде у виробництві. Постарайтеся не бути розумнішими, ніж ваші власні проблеми безпеки.
jinzai
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.