• ShellExecuteEx예제 관리자 권한 실행

    2026. 9. 27.

    by. 대왕콜팝

    ShellExecuteEx 관리자 권한 실행 예제와 runas 사용법

    목차

    • 1. ShellExecuteEx란 무엇인가
    • 2. 관리자 권한 실행에 runas 사용하는 방법
    • 3. ShellExecuteEx 관리자 권한 실행 예제
    • 4. 실행 파일에 인수 전달하는 방법
    • 5. 실행 실패와 UAC 처리 방법
    • 6. ShellExecuteEx 사용 시 주의사항

    1. ShellExecuteEx란 무엇인가

    ShellExecuteEx는 Windows에서 프로그램이나 파일을 실행할 때 사용하는 Win32 API입니다. 단순 실행뿐 아니라 특정 동작을 지정하거나 실행된 프로세스의 핸들을 받아 후속 처리를 할 수 있다는 점이 특징입니다.

    사용할 때는 SHELLEXECUTEINFO 구조체에 실행 파일 경로, 명령어 인수, 작업 디렉터리, 표시 방식 등을 설정한 뒤 ShellExecuteEx 함수를 호출합니다. 성공하면 TRUE, 실패하면 FALSE를 반환하며 자세한 오류 원인은 GetLastError로 확인할 수 있습니다.

    특히 일반 권한으로 실행 중인 프로그램에서 별도의 프로그램을 관리자 권한으로 실행해야 할 때 많이 사용됩니다.

    2. 관리자 권한 실행에 runas 사용하는 방법

    ShellExecuteEx에서 관리자 권한을 요청하려면 SHELLEXECUTEINFO 구조체의 lpVerb 값을 "runas"로 지정하면 됩니다. Windows는 이를 관리자 권한 실행 요청으로 인식하고 UAC 사용자 계정 컨트롤 창을 표시합니다.

    사용자가 UAC 요청을 승인하면 대상 프로그램이 상승된 관리자 권한으로 실행됩니다. 일반 사용자 계정이라면 관리자 계정의 자격 증명을 입력해야 할 수도 있습니다.

    설정 항목 설정 내용
    lpVerb 관리자 권한 실행 시 "runas" 지정
    lpFile 실행할 EXE 파일의 경로
    lpParameters 프로그램에 전달할 실행 인수
    nShow SW_SHOWNORMAL 등 창 표시 방식 지정

    3. ShellExecuteEx 관리자 권한 실행 예제

    C++에서 메모장을 관리자 권한으로 실행하는 가장 기본적인 예제는 다음과 같은 형태로 작성할 수 있습니다.

    SHELLEXECUTEINFO 구조체를 0으로 초기화하고 cbSize에 구조체 크기를 지정한 뒤 lpVerb에 L"runas", lpFile에 실행 프로그램을 넣는 방식입니다.

    예를 들어 핵심 코드는 SHELLEXECUTEINFO sei = { sizeof(sei) }; 형태로 구조체를 생성한 뒤 sei.lpVerb = L"runas"; sei.lpFile = L"notepad.exe"; sei.nShow = SW_SHOWNORMAL; 순서로 값을 설정하고 ShellExecuteEx(&sei)를 호출하면 됩니다.

    유니코드 환경에서는 ShellExecuteExW와 SHELLEXECUTEINFOW를 명시적으로 사용할 수도 있습니다. 일반적인 Visual Studio 프로젝트에서 UNICODE가 정의되어 있다면 ShellExecuteEx 매크로가 자동으로 W 버전을 선택합니다.

    4. 실행 파일에 인수 전달하는 방법

    관리자 권한으로 실행하면서 명령줄 옵션까지 전달하려면 lpParameters를 사용합니다. 예를 들어 프로그램을 "--install" 옵션과 함께 실행하려면 lpFile에는 EXE 경로만 넣고 lpParameters에 L"--install"을 설정합니다.

    실행 파일 경로와 인수를 하나의 문자열에 합쳐 lpFile에 넣으면 정상적으로 처리되지 않을 수 있으므로 두 값을 구분하는 것이 중요합니다. 경로에 공백이 있는 경우에도 lpFile은 전체 실행 파일 경로로 지정하고 필요한 옵션만 lpParameters에 전달하면 됩니다.

    현재 작업 폴더가 중요한 프로그램이라면 lpDirectory도 함께 지정할 수 있습니다. 프로그램이 상대 경로를 이용해 설정 파일이나 다른 파일을 읽는 경우 작업 디렉터리가 달라지면 오류가 발생할 수 있으므로 확인하는 것이 좋습니다.

    5. 실행 실패와 UAC 처리 방법

    ShellExecuteEx가 FALSE를 반환하면 GetLastError를 이용해 실패 원인을 확인할 수 있습니다. 실행 파일이 존재하지 않거나 접근 권한이 없거나 Shell 처리 과정에서 문제가 발생한 경우 등이 대표적입니다.

    관리자 권한 실행에서는 사용자가 UAC 창에서 취소 버튼을 누르는 상황도 고려해야 합니다. 따라서 ShellExecuteEx 호출 결과만 확인하지 말고 실패했을 때 오류 코드를 처리하는 로직을 추가하는 것이 안정적입니다.

    UAC 창을 코드로 임의 승인하거나 사용자의 동의 없이 상승된 권한을 얻는 방식으로 사용해서는 안 됩니다. "runas"는 정상적인 Windows 관리자 권한 상승 절차를 호출하는 기능이며 실제 실행 여부는 사용자의 승인 또는 관리자 인증에 따라 결정됩니다.

    6. ShellExecuteEx 사용 시 주의사항

    프로그램 전체가 항상 관리자 권한을 필요로 하는 경우에는 매번 ShellExecuteEx로 자신을 재실행하기보다 애플리케이션 매니페스트에서 requireAdministrator 설정을 검토하는 것이 적절할 수 있습니다. 반대로 특정 작업만 관리자 권한이 필요한 프로그램이라면 필요한 시점에 별도 프로세스를 "runas"로 실행하는 방식이 사용자 편의성과 보안 측면에서 유리합니다.

    실행된 프로세스의 핸들이 필요한 경우에는 SEE_MASK_NOCLOSEPROCESS 플래그를 설정할 수 있습니다. 이 경우 hProcess를 이용해 프로세스 종료를 기다리거나 상태를 확인할 수 있으며 사용이 끝난 핸들은 CloseHandle로 닫아야 합니다.

    Microsoft 문서에서는 ShellExecuteEx가 COM 기반 Shell 확장으로 실행 작업을 넘길 수 있으므로 사용하는 환경에 따라 호출 전에 COM 초기화가 필요할 수 있다고 안내하고 있습니다.

    공식 홈페이지: learn.microsoft.com