[C#] 프로그래밍 방식으로 프로세스 권한을 높이시겠습니까?

InstallUtil.exe를 사용하여 서비스를 설치하려고하지만를 통해 호출되었습니다 Process.Start. 코드는 다음과 같습니다.

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

여기서 m_strInstallUtil“InstallUtil.exe”의 정규화 된 경로 및 exe strExePath는 내 서비스의 정규화 된 경로 / 이름입니다.

관리자 권한 명령 프롬프트에서 명령 줄 구문을 실행하면 작동합니다. 위의 코드를 사용하여 내 앱에서 실행하지 않습니다. 프로세스 상승 문제를 처리한다고 가정하면 프로세스를 어떻게 상승 상태에서 실행합니까? 이것을 봐야 ShellExecute합니까?

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

또한 설정을 시도 startInfo.Verb = "runas";했지만 문제가 해결되지 않은 것 같습니다.



답변

다음과 같이 startInfo 객체의 Verb 속성을 ‘runas’로 설정하여 새로운 프로세스가 높은 권한으로 시작되어야 함을 나타낼 수 있습니다.

startInfo.Verb = "runas";

이렇게하면 “관리자 권한으로 실행”메뉴 명령을 사용하여 탐색기에서 프로세스가 시작된 것처럼 Windows가 작동합니다.

이것은 UAC 프롬프트가 나타나고 사용자가 확인해야 함을 의미합니다. 바람직하지 않은 경우 (예 : 긴 프로세스 도중에 발생할 수 있음) 전체 호스트 프로세스를 실행해야합니다. ‘highestAvailable’실행 레벨을 요구하는 UAC (Application Manifest) 작성 및 임베드에 의한 권한 상승 : 이로 인해 앱이 시작되는 즉시 UAC 프롬프트가 표시되고 추가 메시지없이 모든 하위 프로세스가 권한 상승으로 실행됩니다. .

편집 : “runas”가 효과가 없다는 질문을 방금 편집 한 것 같습니다. 그것은 정말 이상합니다 (그리고 여러 프로덕션 앱에서 나에게도 해당됩니다). 그러나 매니페스트를 포함하여 상위 프로세스로 상위 프로세스를 실행하도록 요구하는 것은 분명히 효과가 있습니다.


답변

이 코드는 위의 내용을 모두 정리하고 관리자 권한으로 현재 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)

업데이트 : 앱 매니페스트 방식이 선호됩니다.

Visual Studio에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 새 응용 프로그램 매니페스트 파일을 추가하고 파일을 변경하여 위와 같이 관리자가 필요하도록 설정하십시오.

원래 방법의 문제점 : app.xaml.cs OnStartup에 재시작 코드를 넣으면 Shutdown이 호출되었지만 여전히 기본 창을 시작할 수 있습니다. app.xaml.cs init가 실행되지 않으면 특정 주 조건에서이 작업을 수행 할 수 있습니다.


답변

Chris Corio : Windows Vista 사용자 계정 컨트롤을 사용하여 응용 프로그램을 멋지게 재생하도록 가르치는 기사에 따르면 MSDN Magazine, 2007 년 1 월ShellExecute 에는 포함 된 매니페스트 만 확인하고 필요한 경우 사용자에게 권한 상승을 요청하는 반면 CreateProcess다른 API는 그렇지 않습니다. 도움이 되길 바랍니다.

.chm과 동일한 기사를 참조하십시오 .


답변

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

이 작업은 UAC없이 수행되므로 새 프로세스를 시작할 필요가 없습니다. 내 경우와 같이 실행중인 사용자가 Admin 그룹의 구성원 인 경우.


답변

상태를 높이려면 가장을 사용해야합니다.

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

완료되면 가장 된 컨텍스트를 실행 취소하는 것을 잊지 마십시오.


답변