2010-04-21 4 views
6

Windows 레지스트리를 수정할 수있는 간단한 WinForms 응용 프로그램이 있습니다. 문제는 Vista/Windows 7에서 사용자가 강제로 관리자로 전환해야한다는 것입니다.WinForms에서 사용자를 사용자 계정으로 강제 설정하는 방법

사용자가 응용 프로그램의 관리자 양식으로 시작하도록 강요하고 싶지는 않습니다. 나는 그가 레지스트리에 쓸 필요가있을 때 그것을하기를 원한다.

가장 좋은 시나리오는 사용자가 관리자로 전환해야 할 때 관리자 양식으로 실행을 시작할 필요가 없으므로 설치 프로그램의 많은 부분에 나타나는 동일한 메시지에 가장 근접한 시나리오에 도달하는 것입니다.

.Net에서 어떻게 구현할 수 있습니까?

답변

4

응용 프로그램이 때때로 레지스트리 작업을 수행하지 않는 경우 가끔 파티션을 수행하는 방법이 있습니다. 파티셔닝을위한 세 가지 키는 (1) Ho가 말한 것처럼 두 번째 exe에 매니페스트가 있습니다 (2) 버튼/메뉴 항목에 방패를 놓아 사용자가 고도를 예상하고 (3) ShellExecute로 Start를 호출하면 UseShellExecuteFlag를 true로 설정하여 매니페스트가 사용됩니다.

그러나 앱을 분할하는 문제가 발생하기 전에 두 가지 질문을하겠습니다. 첫째, 비 관리자 목적으로 사용되었거나 모든 사용자가 항상 "해당 버튼을 클릭"하고 상승해야합니까? 그렇다면 앱에 매니페스트 매니페스트를 넣고 파티션을 나누지 마십시오. 둘째, 레지스트리의 해당 부분에 반드시 작성해야합니까? HKCU에서 무언가로 열쇠를 옮길 수 있습니까? 할 수 있으면 더 이상 고도가 필요없고 모두가 행복해집니다. 나는 항상 그 가능성을 고려하기를 좋아한다. 왜냐하면 그것들은 partioning보다 적은 코드와 적은 테스트를 의미하기 때문이다.

+0

파일 연결에 대한 권한이 필요합니다. HKCU에서는 상대방의 연결을 확인합니다. (좋은 해결책이 아닌 것처럼 보입니다. –

1

내가 아는 한, 프로세스를 향상시키는 API는 없습니다. 프로세스가 상승 된 모드에서 다른 프로세스를 시작하려고 할 때 자동으로 발생합니다.

Windows Installer에서도 작동합니다. 말 그대로 다른 승격 된 프로세스를 시작하거나 상승 된 COM 개체를 만드는 경우 확실하지 않지만 실제로는 똑같습니다.

저는 개인적으로 프로세스 중간 실행을 향상시키기위한이 해킹 해결책을 사용하지 않을 것입니다. 귀하의 프로세스가 일 수 있고 일 때 표고가 필요하다면, 명시 적으로이를 매니페스트와 함께 명시하고 시작시 동의 메시지 팝업을 보냅니다. 그러나 절대적으로 이것을해야한다면 앱에서 고가의 프로세스를 시작해야합니다.

+1

실제로 필요할 때 높이를 물어 보는 것이 좋습니다. 동일한 Windows Installer의 경우 옵션을 통해 진행할 수 있으며 앱을 높은 모드로 실행하지 않고도 언제든지 취소 할 수 있습니다. 그것은 단지 "쇼를 위해서"가 아니라 고도를 요구할 것입니다. –

+0

@Artiom :하지만 제가 설명했듯이 설치자는 단지 스텁 일뿐입니다. 실제 "설치"는 out-of-process로 수행됩니다. 이 방법론은 특정한 상승 된 "단계"로 응용 프로그램을 분할하거나 동일한 방식으로 분할 할 수있는 경우에만 의미가 있습니다. 그렇지 않으면 응용 프로그램이 2 분마다 또는 별도의 프로세스를 시작하려고 할 때마다 또는 높이가 필요하다고 결정할 때마다 좋은것. – Aaronaught

+0

사실, 당신은 절대적으로 맞습니다. –

2

Aaronaught가 말했듯이, 나는 프로세스가 자신을 높이기 위해 요청할 수 있다고 생각하지 않습니다. 이 문제를 해결할 수있는 방법 중 하나는 프로세스를 두 개의 응용 프로그램으로 나눠서 처리하는 것입니다. 하나는 정상적인 작업이고 다른 하나는 레지스트리에 쓰는 것 뿐이며

<requestedExecutionLevel level="requireAdministrator"/> 
관련 문제