2012-07-20 4 views
20

마침내 관리 할 때까지 몇 시간 동안 계속되었습니다. 이 나에게 올바른 방향을 가리키는 링크가 이미 있습니다관리자 권한이 필요한 응용 프로그램을 실행하는 방법

는하지만 문제의 간단한 개요 : 다른 사람을 도울 수 있다고 생각했습니다.

+0

['LogonUser'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa378184 (v = vs.85) .aspx)가 잘 작동해야한다고 생각합니다. 설명에서 바로 프로세스를 만드는 것에 대해 언급합니다. – chris

+0

.... 귀하의 질문은 무엇입니까? –

+2

그렇습니다. I와 같은 문제를 겪는 사람들을위한 솔루션입니다. – Samuel

답변

27

실제 문제 (위키 백과 : http://en.wikipedia.org/wiki/User_Account_Control가)

매니페스트에서 "requireAdministrator"로 표시되어 실행 파일은 CreateProcess를를 사용하여 비 상승 과정에서 시작할 수 없습니다(). 대신 ERROR_ELEVATION_REQUIRED가 반환됩니다. 대신 ShellExecute() 또는 ShellExecuteEx()를 사용해야합니다.

(BTW, ERROR_ELEVATION_REQUIRED 오류 == 740)

솔루션 (동일 위치)

동일한 "RUNAS가 '동사가 된 ShellExecute에 첨가 될 수있는 고유의 Win32 애플리케이션()에서 또는 ShellExecuteEx() 호출.

ShellExecute(hwnd, "runas", "C:\\Windows\\Notepad.exe", 0, 0, SW_SHOWNORMAL);

이것은 또한 도움이 될 수있다 : (출처 : http://mark.koli.ch/2009/12/uac-prompt-from-java-createprocess-error740-the-requested-operation-requires-elevation.html)

2 - 기본

좋아 UAC 흐름, 당신이 그것을 파고 전에, 그래서 나는 줄 알았는데 UAC를 인식하는 응용 프로그램의 기본 흐름과 모든 것이 어떻게 잘 맞는지 설명하는 데 도움이됩니다. 일반적으로 응용 프로그램은 권한이없는 사용자로 실행됩니다. 그러나 때로는 관리자가되어야합니다 (무엇이든 할 수 있습니다). 그래서, 여기에 기본적인 아이디어는 의사 코드에서의 :

if(0 == CreateProcess(argv[2], params, NULL, NULL, false, 0, NULL, NULL, &si, &pi)) { 
     //runas word is a hack to require UAC elevation 
     ShellExecute(NULL, "runas", argv[2], params, NULL, SW_SHOWNORMAL); 
} 

그리고 단지 completness을 위하여 -에서 ShellExecute 및 CreateProcess를에 MSDN 링크 :

int main (int argc, char **argv) { 

    HRESULT operation = tryToDoSomethingPrivileged(); 

    if (operation == ACCESS_DENIED && !alreadyElevated) { 

    // Spawn a copy of ourselves, via ShellExecuteEx(). 
    // The "runas" verb is important because that's what 
    // internally triggers Windows to open up a UAC prompt. 
    HANDLE child = ShellExecuteEx(argc, argv, "runas"); 

    if (child) { 
     // User accepted UAC prompt (gave permission). 
     // The unprivileged parent should wait for 
     // the privileged child to finish. 
     WaitForSingleObject(child, INFINITE); 
     CloseHandle(pid); 
    } 
    else { 
     // User rejected UAC prompt. 
     return FAILURE; 
    } 

    return SUCCESS; 

    } 

    return SUCCESS; 

} 
마지막으로

, 이것은 내가 그것을 한 적이 어떻게 :

http://msdn.microsoft.com/en-us/library/bb762153%28v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/ms682425%28VS.85%29.aspx

+0

나는 내 응용 프로그램 중 하나에서 동일한 접근법을 사용했습니다. 하나의 권한있는 작업을 수행하기 위해 "runas"를 통해 권한 상승 된 복사본을 생성합니다. 스폰 된 자식 프로세스의 명령 줄에서 수행 할 작업을 알려줍니다. Microsoft가 UAC 고도를 사용하는 방식을 선호하는 것이 아니며 주 .exe에 대한 UAC 매니페스트가 과도한 경우에 작동합니다. Microsoft는 UAC 매니페스트가 포함 된 자체 .exe 또는 COM Elevation 모니 커를 통해 인스턴스화 된 자체 COM 개체에 권한있는 작업을 선호합니다. –

+3

ShellExecuteEx는 하나의 인수, SHELLEXECUTEINFO에 대한 포인터를 취합니다. http://msdn.microsoft.com/en-us/library/windows/desktop/bb762154(v=vs.85).aspx –

+1

"runas"작업은 다른 문서에서 언급하지 않았지만 문서 (of ShellExecute) : 페이지의 일부 사용자조차도 안전하게 사용할 수 있다고 주장했습니다. 그것이 작동한다는 사실은 그것을 증명하는 문서의 일부로서 (당신이 직접 수표를 써야하고 어떤 경우에는 작동하지 않을 수도 있기 때문에) 신뢰할만한 것이 아닙니다. 거기에 runas의 신뢰성에 대한 참고 자료가있는 사람이 있습니까? – reallynice