2014-11-03 7 views
5

Мое приложение не всегда требует привилегий «admin», и большая часть времени будет выполняться как текущий пользователь. Есть ли способ, я могу эскалировать личность, вызывая UAC во время выполнения после того, как моя программа уже запущена? Это произойдет только тогда, когда мне нужны привилегии. Вместо того, чтобы начинать с высоких привилегированных.Приоритет эскалации в Runtime (Windows API C/C++)

Я знаю «Runas» метод, файл манифеста и т.д., но все это до того, как процесс создания, а не во время выполнения, по требованию

ответ

9

Поздравляем, это точно, как контроль учетных записей предназначен для работы, и что-то большинство разработчиков приложений либо слишком ленивы, либо слишком напуганы, чтобы когда-либо задуматься о том, чтобы посмотреть :)

В двух словах вы помещаете код, который нуждается в повышении в отдельном 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