2011-01-09 4 views
7

내가 (북마크 동기화 크롬을 생각하는 프로그램 파일과 다른 컴퓨터에서 동일한 게임의 다른 사본에서 설치 게임에서 다양한 설정을 동기화 작은 C의 # /. NET 4.0 응용 프로그램을 작성했습니다UAC 프롬프트없이 시작시 시작된 응용 프로그램에 관리자 권한을 부여 하시겠습니까?

배경, 그러나이 게임을 위해). 동기화 자체는 게임의 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 환호 : – Machinarius

답변

6

Windows 서비스 내에 동기화 기능을 포함시켜야합니다. Windows에서 '백그라운드'기능을 실행하는 데 선호되는 방법입니다.

서비스는 사용자 계정으로 실행될 수 있으며 (파일 수정 권한이있는 경우) 또는 다른 계정을 사용할 수 있습니다. 최악의 경우, SYSTEM으로 실행할 수 있습니다 (단, 이는 모범 사례가 아닙니다).

백그라운드 프로세스 기능이 작동하는 경우 서비스로 변환하는 간단한 프로세스 여야합니다. http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx

+0

고맙습니다 - 설치 중 서비스가 할 수있는 것처럼 보입니다. 감사! – iKenndac

2

내가 보안 네임 스페이스를 사용하고 사용자 역할에 대한 인라인을 확인합니다 :

는이 올바른 길을 것이다 여기에 샘플 프로젝트가있다.

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를 직접 수행하지 않아도됩니다. 당신은 작은 "시작 작업 설정"응용 프로그램을 실행하고 응용 프로그램이 상승되어야한다는 것을 지정하고 사용자는 메시지를 표시하지 않습니다. 나는 그것이 당신의 마지막 단락에서의 질문에 대한 답이라고 믿습니다.

관련 문제