Предоставление прав администратора приложению, запущенному при запуске без запроса UAC? - PullRequest
7 голосов
/ 09 января 2011

Фон

Я написал небольшое приложение на C # /. NET 4.0, которое синхронизирует различные настройки из игры, установленной в программных файлах, и из других копий одной и той же игры в разныхмашины (думаю Chrome синхронизировать закладки, но для этой игры).Сама синхронизация является относительно простым делом, имея дело с файлами, хранящимися в папке Program Files игры.

На моей машине это работает нормально, без необходимости повышения уровня приложения через UAC.Windows 7 заставляет игру использовать виртуализацию Program Files, и мое приложение прекрасно с ней работает.

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

Итак, мы просто устанавливаем манифест приложения, требующий прав администратора, верно?Это хорошо (хотя и не идеально), когда пользователь вручную вызывает приложение или процесс синхронизации, потому что он будет взаимодействовать с приложением и готов принять запрос UAC.

Однако одна из функций моегоПриложение - это опция «Синхронизировать автоматически», которая позволяет пользователю «установить и забыть» приложение.С этим набором приложение помещает себя в реестр по адресу HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Run для запуска при запуске и сидит в системном трее, синхронизируя настройки в фоновом режиме по мере необходимости.

Очевидно,Мне нужно быть умнее здесь.Представление приглашения UAC, как только пользователь входит в свою учетную запись или через случайные промежутки времени, не является способом продвижения вперед.

Итак, мой вопрос!

Как лучше всего подходить к ситуации, когда мне нужно запускать приложение при запуске, которое требует прав администратора?Есть ли способ заставить пользователя авторизовать установку, при которой система автоматически запускает приложение с правильными привилегиями без запроса при запуске / входе в систему?

Обновление Просто, чтобы было ясно,это должно быть достижимо в коде.

Ответы [ 3 ]

6 голосов
/ 09 января 2011

Вам следует подумать о том, чтобы ваша функция синхронизации существовала в службе Windows. Это предпочтительный метод для запуска «фоновой» функциональности в Windows.

Служба может работать либо под учетной записью пользователя (при условии, что у него есть разрешения на изменение файлов), либо вы можете использовать другую учетную запись, которая делает это. В худшем случае вы можете работать как SYSTEM (хотя это не лучшая практика).

Если у вас уже работает функция фонового процесса, тогда этот процесс должен быть простым для преобразования в Сервис.

Здесь приведен пример проекта, который поможет вам выбрать правильный путь: http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx

2 голосов
/ 09 января 2011

Я бы использовал пространство имен Security и проверял бы встроенные роли пользователей.

using System.Threading;
using System.Security.Principal;

namespace StackOverflow_Demo
{
  class Program
  {
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
        WindowsPrincipal currentPrincipal = (WindowsPrincipal) Thread.CurrentPrincipal;

        if (currentPrincipal.IsInRole("Administrators"))
        {
            // continue programm
        }
        else
        {
            // throw exception/show errorMessage - exit programm
        }
     }
   }
 }

CurrentUser может запустить ваше приложение и получить информационное сообщение, если он не является членом роли администратора!

Надеюсь, это поможет!

1 голос
/ 17 июня 2011

Поскольку вы упомянули запуск при запуске, почему бы не использовать запланированное задание вместо того, что вы делаете с реестром? Вы можете настроить их из кода - есть проект на CodePlex , который в основном представляет собой управляемую оболочку, чтобы избавить вас от необходимости выполнять PInvokes самостоятельно. Вы запускаете свое небольшое приложение «Настройка задачи запуска» с повышенными правами, и оно указывает, что приложение должно запускаться с повышенными правами, и пользователю даже не будет предложено. Я полагаю, что это ответ на вопрос в вашем последнем абзаце.

...