Поздравляем, это точно, как контроль учетных записей предназначен для работы, и что-то большинство разработчиков приложений либо слишком ленивы, либо слишком напуганы, чтобы когда-либо задуматься о том, чтобы посмотреть :)
В двух словах вы помещаете код, который нуждается в повышении в отдельном 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-объект будет создан с повышенным токеном.
Удивительный! благодаря! Только то, что я искал! – MathOldTimer