2011-01-09 3 views
7

фонПредоставление прав администратора при запуске приложения при запуске без приглашения UAC?

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

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

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

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

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

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

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

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

Обновление Чтобы быть ясным, это должно быть осуществимо в коде.

+1

Я думаю, что это просветит вас: http://stackoverflow.com/questions/2488632/win-c-run-app-as-administrator-without-uac-prompt/2488645#2488645 Cheers :) – Machinarius

ответ

6

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

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

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

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

+0

Спасибо - установка как услуга, кажется, способ сделать. Благодаря! – iKenndac

2

Я хотел бы использовать пространство имен 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 может запустить приложение и получите информационное сообщение, если он не является членом admininistrator роли!

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

+0

Спасибо, но это не ответ на вопрос, который я задал! – iKenndac

+0

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

1

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