Complimenti, questo è esattamente il modo UAC è progettato per funzionare, e qualcosa la maggior parte degli sviluppatori di applicazioni è o troppo pigra o troppo spaventata per contemplare l'aspetto :)
In poche parole, si inserisce il codice che richiede l'elevazione in un oggetto COM separato (che vive in una DLL) e quindi si crea un istanza elevata di esso utilizzando il metodo descritto 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);
}
La chiave è la Elevation:Administrator!new:
prefisso al nome del moniker. Ciò causa l'attivazione della richiesta di elevazione e l'oggetto COM risultante verrà creato con un token elevato.
fonte
2014-11-03 13:06:51
Fantastico! Grazie! Proprio quello che stavo cercando! – MathOldTimer