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


147

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.UseShellExecute = true;추가에 startInfo.Verb = "runas";나를 위해 벌금을했다.
매트

답변:


172

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

startInfo.Verb = "runas";

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

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

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


9
"runas"도 저에게 효과가 없었습니다. UAC를 끈 상태에서만 작동 할 수 있습니까?
Dirk Vollmar

18
@LukePuplett 감사합니다. 실제로 사용자 역할을 완전히 분리하지 않고 루트 키트 설치를 완화 할 수있는 좋은 방법입니다.
Colton

6
@ 스파크 시스, 그러나 또 다른 관점이 있습니다. OS를 방어하는 방법을 알고있는 사람들은 UAC없이 OS를 수행하는 방법을 알고 있습니다. 방어의 내용을 모르는 더미 사용자는 UAC 창이 표시 될 때마다 '예'를 클릭합니다. 또한 악의적 인 해커 바이러스 작성자가 악용을 통해이를 우회하는 것을 막을 수있는 방법은 없습니다.) 따라서 LukePuplett =)
Jet

24
startInfo.ShellExecute=true이것도 작동 하도록 설정 해야하는 것 같습니다 ... 또한 네트워크 공유에있는 실행 파일과 함께 작동하기 위해이 방법을 사용할 수 없었습니다 (실행하기 전에 로컬 temp 디렉토리에 복사해야 함). ..
TCC

7
@Jet 죄송하지만 잘못된 사고 방식입니다. 설치 중에 UAC 대화 상자가 표시 될 때마다 시스템이 실패합니다. 중요한 것은 고도를 요구하는 것을 실행하지 않고 UAC 상자를 볼 때입니다. 아무리 당신이나 우리 모두 PC에 있다고 생각하더라도 제로 데이 / 드라이브 바이 다운로드 (예 : 공식 노벨상 사이트의 최신 다운로드)를 마술처럼 막을 수는 없습니다. 해당 사이트를 탐색하고 UAC 프롬프트가 표시되면 문제가있는 것입니다. UAC가 꺼져 있으면 봇넷에 가입 한 것을 결코 알 수 없습니다. 사전 경고 비용은 가끔 예를 클릭해야합니다.
기본

46

이 코드는 위의 내용을 모두 정리하고 관리자 권한으로 현재 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가 실행되지 않으면 특정 주 조건에서이 작업을 수행 할 수 있습니다.


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

내 경우에는 requireAdministrator가 작동하지 않았습니다. 그래서 나는 당신의 방식으로해야했습니다. 이것은 내 문제를 해결했습니다! 감사합니다. 그러나 단일 인스턴스 애플리케이션을 false로 설정해야했습니다.
chris

이것은 나를 위해 일했습니다. 또한 원본 string[] args을 다시 생성 된 프로세스로 전달했습니다 .
DotNetPadawan


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

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


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

아마도 * "경우 실행중인 사용자는 관리자의 일원이있다"
hB0

1
흥미로운 -이 어떤 방법에 갈 수있다,뿐만 아니라 작업 방법 (나는 심지어 ASPX 페이지에 정의 된 방법에 그것을 시도)
Simon_Weaver

1

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

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

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


28
accessToken을 얻는 방법을 말하지 않았습니다. LogonUser는 UAC가 활성화 된 경우 사용자의 제한된 보안 컨텍스트를 제공합니다.
cwa

VSTS를 사용하는 경우 웹 포털의 설정에서 개인용 액세스 토큰을 얻을 수 있습니다. (사용자 사진 옆의 설정 아이콘을 찾으십시오.) MSDocs
Su Llewellyn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.