프로그램을 관리자 권한으로 실행하는 코드

출처

권한을 확인하고 관리자 권한이 아니면 다른 프로세스로 관리 권한을 부여하고 다시 시작한다

Thread.GetDomain().SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
var pri = (WindowsPrincipal)Thread.CurrentPrincipal;

//관리자 권한 이외로 실행했다면 다른 프로세스로 이 프로세스를 실행한다
if (!pri.IsInRole(WindowsBuiltInRole.Administrator))
{
    var proc = new ProcessStartInfo()
    {
        WorkingDirectory = Environment.CurrentDirectory,
        FileName = Assembly.GetEntryAssembly().Location,
        Verb = "RunAs"
    };

    if (args.Length >= 1)
        proc.Arguments = string.Join(" ", args);

    //다른 프로세스로 이 프로세스를 실행한다
    Process.Start(proc);

    //현재 프로세스 종료
    return;

}

위 처리를 Release 빌드 시에만 활성화하여 Visual Studio에서 디버깅 시는 기존 프로세스 그대로 동작하게 하면 디버깅 할 수 있다.
다음 전체 소스이다.

using System;
using System.Diagnostics;
using System.Reflection;
using System.Security.Principal;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {

#if (DEBUG)
        Thread.GetDomain().SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
        var pri = (WindowsPrincipal)Thread.CurrentPrincipal;

        //관리자 권한 이외로 실행했다면 다른 프로세스로 이 프로세스를 실행한다
        if (!pri.IsInRole(WindowsBuiltInRole.Administrator))
        {
            var proc = new ProcessStartInfo()
            {
                WorkingDirectory = Environment.CurrentDirectory,
                FileName = Assembly.GetEntryAssembly().Location,
                Verb = "RunAs"
            };

            if (args.Length >= 1)
                proc.Arguments = string.Join(" ", args);

            //다른 프로세스로 이 프로세스를 실행한다
            Process.Start(proc);

            //현재 프로세스 종료
            return;

        }
#endif

        /* 주 처리 */

    }
}

시작할 때 관리자 권한이 있는지 확인하고, 재 시작해서 매니페스트 파일을 사용하지 않고 응용 프로그램을 관리자 권한으로 실행 할 수 있다.


이 글은 2019-04-21에 작성되었습니다.