2014-11-03 9 views
5

내 응용 프로그램에 항상 "관리자"권한이 필요하지 않으며 대부분의 시간이 현재 사용자로 실행됩니다. 어떤 방법이 있습니까, 내 프로그램이 이미 실행 된 후 런타임에 UAC를 실행하여 개인을 확대 할 수 있습니까? 이것은 내가 사생활이 필요할 때만 발생합니다. 높은 privs로 시작하는 것보다.런타임시 권한 상승 (Windows API C/C++)

나는 기술, 매니페스트 파일 등 "RUNAS"을 알고 있지만 프로세스가 생성되지 런타임에, 주문형

답변

9

축하, 즉 UAC가 작동하도록 설계되었습니다 정확히 어떻게, 그리고 어떤 전에 모든입니다 대부분의 응용 프로그램 개발자는 너무 게으르거나 보는 것을 고려하기에 너무 무서워합니다.

간단히 말해서 고도가 필요한 코드를 별도의 COM 개체 (DLL에 있음)에 넣은 다음 here에 설명 된 방법을 사용하여 상승 된 인스턴스.

HRESULT CoCreateInstanceAsAdmin(HWND hwnd, REFCLSID rclsid, REFIID riid, __out void ** ppv) 
{ 
    BIND_OPTS3 bo; 
    WCHAR wszCLSID[50]; 
    WCHAR wszMonikerName[300]; 

    StringFromGUID2(rclsid, wszCLSID, sizeof(wszCLSID)/sizeof(wszCLSID[0])); 
    HRESULT hr = StringCchPrintf(wszMonikerName, sizeof(wszMonikerName)/sizeof(wszMonikerName[0]),\ 
     L"Elevation:Administrator!new:%s", wszCLSID); 
    if (FAILED(hr)) 
     return hr; 
    memset(&bo, 0, sizeof(bo)); 
    bo.cbStruct = sizeof(bo); 
    bo.hwnd = hwnd; 
    bo.dwClassContext = CLSCTX_LOCAL_SERVER; 
    return CoGetObject(wszMonikerName, &bo, riid, ppv); 
} 

키는 모니 커 이름 앞에 Elevation:Administrator!new:입니다. 이로 인해 권한 상승 프롬프트가 트리거되고 결과 COM 개체가 상승 된 토큰으로 만들어집니다.

+0

굉장! 감사! 그냥 내가 뭘 찾고 있었는지! – MathOldTimer