Как запросить повышение привелегий?

197
17 мая 2021, 06:20

Как запросить повышения прав пользователя. Например если это инсталятор службы, то функция установки даёт ошибку - не хватает прав. Многие инсталяторы делают это обычным диалогом при запуске. Т.е. окно на весь экран с двумя полями: логин и пароль. Думаю каждый кто работает из-под пользователя знает это окно. Если работа идет из-под администратора (не корневого) то в окне две кнопки - да и нет. Как такое сделать на с#?

Answer 1

Возможны варианты

  1. Вариант с перезапуском, проверить

     static internal bool IsRunAsAdmin()
         {
             WindowsIdentity id = WindowsIdentity.GetCurrent();
             WindowsPrincipal principal = new WindowsPrincipal(id);
             return principal.IsInRole(WindowsBuiltInRole.Administrator);
         }
    

и перезагрузить программу выполнив

 ProcessStartInfo proc = new ProcessStartInfo(); 
    proc.UseShellExecute = true; 
    proc.WorkingDirectory = Environment.CurrentDirectory; 
    proc.FileName = Application.ExecutablePath; 
    proc.Verb = "runas"; 
    try 
    { 
        Process.Start(proc); 
        Application.Exit(); // Завершить текущую.
    } 
    catch 
    { 
    } 
  1. Вариант с ресурсами (будет всегда запрашивать)

Ресурс RT_MANIFEST долен сожержать

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
   <security> 
      <requestedPrivileges> 
         <requestedExecutionLevel 
            level="requireAdministrator" 
         /> 
      </requestedPrivileges> 
   </security> 
</trustInfo> 

Через студию можно так (цитата): Чтобы настроить уровень повышения привилегий в данном проекте Visual C# Windows Forms, откройте свойства проекта, перейдите на вкладку «Безопасность», поставьте флажок напротив пункта «Включить параметры безопасности ClickOnce-приложений», выберите «Это приложение с полным доверием», а затем закройте страницу Свойства приложения. Это приведет к созданию файла app.manifest и настроит проект для встраивания манифеста. Вы можете открыть файл "app.manifest" в обозревателе решений, развернув папку Свойства. В файле содержится следующее содержимое по умолчанию. Строку

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

Заменить asInvoker на requireAdministrator

  1. (Ошибочный) Если есть учётка (логин пароль) или её токен, то можно применить учетку.

     WindowsIdentity newId = new WindowsIdentity(_tokenHandle);
     WindowsImpersonationContext ctx= newId.Impersonate();
     ....
     ctx.Undo(); // отменить действие учётки 
    

А далее возможны варианты. Получить токен можно так http://stackoverflow.com/a/35426713/5727271 (тут не хватает Undo).

Админская учётка может не иметь полных прав, даже если извесны логин и пароль. Полные права можно получить через UAC (1 и 2).

Думаю если программа будет странным способом клянчить учётку - не вариант. Возможно вариант подойдет, если где-то шифровано её хранить.

P.S. Проанализировал как это делают FAR и Total - там принцип тот же что в [1], но чуть усложнили. Когда происходит security-error - запускается вторая копия приложения (с повышением привелегий, при этом появляется диалог). Потом с второй копией программы устанавливается связь, и прилегивированую операцию делает вторая копия, а первая используется как "консоль".

Ссылки

  • http://code.msdn.microsoft.com/windowsapps/CSUACSelfElevation-644673d3
  • http://docs.microsoft.com/en-us/dotnet/standard/security/impersonating-and-reverting
READ ALSO
Загрузка данных в Entity Framework 6

Загрузка данных в Entity Framework 6

Проблема в следующем: Имеются в БД таблицы со связью некоторых таблиц многие ко многим (Отображу в виде классов EntityFramework):

106
Как отобразить коллекцию как значение в DataGrid?

Как отобразить коллекцию как значение в DataGrid?

Есть DataGrid, ItemsSource которого является List<Author>В классе Author есть публичное свойство List<Book>

107
Сортировка List&lt;GameObject&gt;

Сортировка List<GameObject>

Как можно отсортировать List по алфавиту используя gameObjectname?

352
Как остановить цикл? C#

Как остановить цикл? C#

Есть кнопка которая при нажатии запускает действие, и при повторном нажатии останавливает

87