Domanda

sto sviluppando un COM surrogato oggetto in C, saranno utilizzati da mie applicazioni per richiamare la finestra di dialogo del controllo account utente per alcune azioni che richiedono diritti amministrativi.

Il piano è quello di rendere questo esportare una funzione che accetta un puntatore a una funzione con un numero variabile di argomenti e l'esegue in un contesto diverso. In questo modo, un'applicazione può utilizzare questo oggetto per eseguire alcune azioni con diritti di amministratore, tutto ciò che devono fare è utilizzare l'oggetto e passare un puntatore alla funzione che deve essere eseguita con tali diritti.

Questo funziona in parte, chiamando CoCreateInstance va bene, il puntatore a funzione viene passato e viene eseguita la mia funzione. Tuttavia, quando creo un'istanza di questo oggetto utilizzando CoCreateInstanceAsAdmin , si verificano dei problemi; ecco il codice:


HRESULT CoCreateInstanceAsAdmin(HWND hwnd, REFCLSID rclsid, REFIID riid, __out void ** ppv)
{
 // Manual implementation of CreateInstanceAsAdmin
 CComPtr BindCtx;
 HRESULT hr = CreateBindCtx(0,&BindCtx);
 BIND_OPTS3 bo;
 memset(&bo, 0, sizeof(bo));
 bo.cbStruct = sizeof(bo);
 bo.grfMode = STGM_READWRITE;
 bo.hwnd = hwnd;
 bo.dwClassContext = CLSCTX_LOCAL_SERVER;
 hr = BindCtx->SetBindOptions(&bo);
 if (SUCCEEDED(hr))
 {
  // Use the passed in CLSID to help create the COM elevation moniker string
  CComPtr Moniker;
  WCHAR wszCLSID[50];
  WCHAR wszMonikerName[300];
  StringFromGUID2(rclsid,wszCLSID,sizeof(wszCLSID) / sizeof(wszCLSID[0]));
  //Elevation:Administrator!new
  hr = StringCchPrintfW(wszMonikerName, sizeof(wszMonikerName)/sizeof(wszMonikerName[0]), L"Elevation:Administrator!new:%s", wszCLSID);
  if (SUCCEEDED(hr))
  {
   // Create the COM elevation moniker
   ULONG ulEaten = 0;
   ULONG ulLen = (ULONG)wcslen(wszMonikerName);
   LPBC pBindCtx = BindCtx.p;
   hr = MkParseDisplayName(pBindCtx,wszMonikerName,&ulEaten,&Moniker);
   if (SUCCEEDED(hr) && ulEaten == ulLen)
   {
    // Use passed in reference to IID to bind to the object
    IDispatch * pv = NULL;
    hr = Moniker->BindToObject(pBindCtx,NULL,riid,ppv);
   }
  }
 }
 return hr;
}

La chiamata CoCreateInstanceAsAdmin non riesce con "Classe non registrata".

L'oggetto viene registrato creando le seguenti chiavi di registro (ecco il corpo del file REG)


[HKEY_CLASSES_ROOT\COMsurrogate]
@="COMsurrogate Class"

[HKEY_CLASSES_ROOT\COMsurrogate\CurVer]
@="COMsurrogate.1"

[HKEY_CLASSES_ROOT\COMsurrogate\CLSID]
@="{686B6F70-06AE-4dfd-8C26-4564684D9F9F}"

[HKEY_CLASSES_ROOT\CLSID\{686B6F70-06AE-4dfd-8C26-4564684D9F9F}]
@="COMsurrogate Class"
"LocalizedString"="@C:\\Windows\\system32\\COMsurrogate.dll,-101"
"DllSurrogate"=""

[HKEY_CLASSES_ROOT\CLSID\{686B6F70-06AE-4dfd-8C26-4564684D9F9F}\ProgID]
@="COMsurrogate.1"

[HKEY_CLASSES_ROOT\CLSID\{686B6F70-06AE-4dfd-8C26-4564684D9F9F}\VersionIndependentProgID]
@="COMsurrogate"

[HKEY_CLASSES_ROOT\CLSID\{686B6F70-06AE-4dfd-8C26-4564684D9F9F}\InprocServer32]
@="@C:\\windows\system32\COMsurrogate.dll"
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT\CLSID\{686B6F70-06AE-4dfd-8C26-4564684D9F9F}\NotInsertable]

[HKEY_CLASSES_ROOT\CLSID\{686B6F70-06AE-4dfd-8C26-4564684D9F9F}\Programmable]

suppongo che alcune voci di registro sono mancanti - Questa è la conclusione raggiungo durante la lettura del messaggio di errore. Tuttavia, questo elenco di chiavi di registro è stata compilata dopo aver esplorato la documentazione su MSDN e altri siti -. Quindi sono abbastanza sicuro che nulla è mancato

Tra le cose che ho cercato di risolvere questo è quello di implementare tramite ATL (in modo tale che la registrazione è automatizzato). Che funziona, ma il problema è che non riesco a passare un puntatore funtion per il prototipo di funzione MIDL generato.

Ho cercato di passarlo con il VARIANT Tipo:


 v.vt = VT_PTR;
 void (*myptr)(void);
 myptr = &DoTheStuff;
 v.byref = myptr;
 hr = theElevated->CoTaskExecuter(0, v);

come risultato che ottengo "tipo di argomento non valido".

Qualcuno potrebbe far luce su questo argomento? Forse quello che sto cercando di realizzare non è possibile in base alla progettazione?

Nessuna soluzione corretta

Altri suggerimenti

Credo che i problemi si stanno avendo è di progettazione e che l'intento dei miglioramenti di sicurezza della finestra erano a rischi potenziali di sicurezza consentono di evitare.

Microsoft non vuole realmente di elevare i privilegi se può impedirvi di farlo. L'esecuzione di funzioni arbitrarie come utente privilegiato non dovrebbe essere facile in alcun modo se Windows è anche un sistema decentemente assicurato. Si potrebbe potrebbe provare rappresentazione di un utente diverso con gettoni e ottenere l'accesso meglio così, ma anche in quel caso sarebbe un tratto. Se ricordo bene, imitazioni di utente non sarà nemmeno garantire che si otterrà l'accesso completo. La soluzione migliore in questo caso è solo quello di utilizzare l'account super utente e richiedere correttamente i privilegi corretti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top