2008-09-25 7 views
114

InstallUtil.exe를 사용하여 서비스를 설치하려하지만 Process.Start을 통해 호출합니다. 여기 코드는 다음과 같습니다 m_strInstallUtil을 "InstallUtil.exe는"완전한 경로와 EXE과 strExePath 내 서비스에 대한 완전한 경로/이름입니다프로그래밍 방식으로 프로세스 권한 상승?

ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath); 
System.Diagnostics.Process.Start (startInfo); 

.

관리자 권한 명령 프롬프트에서 명령 줄 구문을 실행하면됩니다. 위의 코드를 사용하여 내 앱에서 실행하는 것은 아닙니다. 나는 프로세스 상승 문제를 다루고 있다고 가정합니다. 그렇다면 어떻게 상승 된 상태에서 프로세스를 실행할 수 있습니까? 이 경우 ShellExecute을 볼 필요가 있습니까?

이것은 모두 Windows Vista에 있습니다. 관리자 권한으로 상승 된 VS2008 디버거에서 프로세스를 실행 중입니다.

나는 또한 startInfo.Verb = "runas"; 설정을 시도했지만 문제를 해결하지 못했습니다.

답변

138

당신은 새로운 프로세스를 나타낼 수는 '에서 runas'에 startInfo 개체의 동사 속성을 설정하여 상승 된 권한으로 시작해야합니다 Explorer에서 "관리자 권한으로 실행"메뉴 명령을 사용하여 시작되었습니다.

이것은 UAC 프롬프트가 나타나고 사용자가 인정해야 함을 의미합니다. 바람직하지 않은 경우 (예 : 긴 프로세스가 진행되는 중간에 발생하기 때문에) Create and Embed an Application Manifest (UAC)에 의해 높은 권한을 가진 전체 호스트 프로세스는 'highestAvailable'실행 수준을 요구합니다. 이렇게하면 응용 프로그램이 시작 되 자마자 UAC 프롬프트가 나타나서 추가로 요청하지 않고 모든 하위 프로세스를 높은 권한으로 실행하게됩니다.

편집 : 방금 "runas"가 작동하지 않는다고 묻는 질문을 편집하셨습니다. 그것은 정말로 이상합니다. (여러 가지 제작 앱에서 나에게 도움이됩니다.) 부모 프로세스가 매니페스트를 임베드하여 높은 권한으로 실행되도록하려면 확실히 작동해야합니다.

+6

"runas"가 나에게 적합하지 않았습니다. UAC가 꺼진 상태에서만 작동 할 수 있습니까? –

+0

그것은 모든 Windows OS에서 작동하는지 궁금합니다. –

+1

이것은 Windows 8에서 작동하지 않는 것 같습니다. 이전 버전에서는 정상적으로 작동했습니다. – Despertar

1

상태를 올리기 위해서는 가장을 사용해야합니다.

WindowsIdentity identity = new WindowsIdentity(accessToken); 
WindowsImpersonationContext context = identity.Impersonate(); 

는이 완료되면 가장 된 컨텍스트를 취소하는 것을 잊지 마십시오. 이 윈도우 프로세스 것처럼 작동하게됩니다

startInfo.Verb = "runas"; 

다음과 같이

+21

accessToken을 얻는 방법에 대해 언급하지 않았습니다. LogonUser는 UAC가 사용되는 경우 사용자의 제한된 보안 컨텍스트를 제공합니다. – cwa

19

this article에 따르면 ShellExecute는 포함 된 매니페스트를 검사하고 필요한 경우 사용자에게 고도를 묻는 반면 CreateProcess 및 다른 API는 그렇지 않은 경우 사용자에게 권한 상승을 요청합니다. 희망이 도움이됩니다.

+1

고마워요, 이것이 제가 일하는 유일한 방법이었습니다. –

+2

링크를 사용할 수 없습니다. –

+0

@ M.Kumaran 죽은 링크가 표시되면 https://web.archive.org를 사용하여 편집하십시오. –

5
[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")] 

이것은 새로운 프로세스를 시작할 필요가없는 UAC 없이도 가능합니다. 저의 경우 실행중인 사용자가 Admin 그룹의 구성원 인 경우.

+0

이 코드를 사용하면 권한 오류가 발생합니다. "보안 엔티티 권한 요청이 실패했습니다.":( – Leonardo

+0

아마도"실행중인 사용자가 관리자 인 경우 "* – hB0

+1

흥미 롭습니다.이 방법은 동작 방법이 아닌 모든 방법을 사용할 수 있습니다. (ASPX 페이지에 정의 된 방법을 시도해 보았습니다.) –

34

이 코드는 모두 함께 위를두고 관리자 privs 및 전류 WPF 응용 프로그램 다시 시작 : 시각에서

오른쪽 클릭 프로젝트 :

if (IsAdministrator() == false) 
{ 
    // Restart program and run as admin 
    var exeName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; 
    ProcessStartInfo startInfo = new ProcessStartInfo(exeName); 
    startInfo.Verb = "runas"; 
    System.Diagnostics.Process.Start(startInfo); 
    Application.Current.Shutdown(); 
    return; 
} 

private static bool IsAdministrator() 
{ 
    WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
    WindowsPrincipal principal = new WindowsPrincipal(identity); 
    return principal.IsInRole(WindowsBuiltInRole.Administrator); 
} 


// To run as admin, alter exe manifest file after building. 
// Or create shortcut with "as admin" checked. 
// Or ShellExecute(C# Process.Start) can elevate - use verb "runas". 
// Or an elevate vbs script can launch programs as admin. 
// (does not work: "runas /user:admin" from cmd-line prompts for admin pass) 

업데이트 : 응용 프로그램 매니페스트 방법이 선호된다 스튜디오, 추가, 새 응용 프로그램 매니페스트 파일, 파일을 변경하여 위와 같이 requireAdministrator를 설정하십시오.

원래의 문제 : app.xaml.cs OnStartup에 다시 시작 코드를 넣으면 시스템 종료가 호출 되어도 여전히 주 창을 시작할 수 있습니다. app.xaml.cs init가 실행되지 않았고 특정 경쟁 조건에서이 작업을 수행하면 주 윈도우가 망가졌습니다.

+0

개선 사항은 아래를 참조하십시오. – JCCyC

+0

requireAdministrator가 제 경우에는 작동하지 않았습니다. 그래서 당신의 방식대로해야했습니다.이게 내 문제를 해결했습니다! 고맙습니다.하지만 Single Instance Application을 false로 설정해야했습니다. – chris