Question

Je développe un COM de remplacement objet en C, il sera utilisé par mes applications pour appeler la boîte de dialogue d'élévation pour certaines actions UAC qui nécessitent des droits d'administration.

Le plan est de faire ce qu'il exporter une fonction qui prend un pointeur vers une fonction avec un nombre variable d'arguments et l'exécute, dans un contexte différent. De cette façon, une application peut utiliser cet objet pour effectuer certaines actions avec des droits d'administrateur, tout ce qu'ils doivent faire est d'utiliser cet objet et passer un pointeur vers la fonction qui doit être exécuté avec les droits dits.

Cela fonctionne partiellement, appelant CoCreateInstance va bien, le pointeur de la fonction est passée et ma fonction est exécutée. Cependant, lorsque je crée une instance de cet objet en utilisant CoCreateInstanceAsAdmin , des problèmes se produisent; voici le code:


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;
}

L'appel CoCreateInstanceAsAdmin échoue avec "classe non enregistrée".

L'objet est enregistré en créant les clés de Registre suivantes (ici est le corps du fichier 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]

Je suppose que certaines entrées de Registre sont manquantes - qui est ma conclusion lors de la lecture du message d'erreur. Cependant, cette liste des clés de registre a été compilé après avoir exploré la documentation sur MSDN et d'autres sites -. Donc je suis assez certain que rien ne manquait

Parmi les choses que j'ai essayé de résoudre ce problème est de mettre en œuvre via ATL (telle que est automatisé d'enregistrement). Cela fonctionne, mais le problème est que je ne peux pas passer un pointeur funtion au prototype de fonction générée MIDL.

J'ai essayé de le transmettre en utilisant VARIANT Type:


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

comme résultat que je reçois "type d'argument non valide".

Quelqu'un pourrait-il faire la lumière sur le sujet? Peut-être ce que je suis en train de réaliser est impossible par la conception?

Pas de solution correcte

Autres conseils

Je crois que les problèmes que vous rencontrez est par la conception et que l'intention des améliorations de la sécurité de la fenêtre devaient aider à éviter les risques de sécurité potentiels.

Microsoft ne veut pas vraiment que vous élevez vos privilèges si elle peut vous empêcher de le faire. L'exécution des fonctions arbitraires en tant qu'utilisateur privilégié ne doit pas être facile d'aucune façon si Windows est même un système sécurisé décemment. Vous pourriez essayer pourrait usurper l'identité d'un autre utilisateur en utilisant des jetons et d'obtenir un meilleur accès de cette façon, mais même alors il serait exagéré. Si je me souviens bien, personnifications des utilisateurs ne seront même pas garantir que vous aurez un accès complet. La meilleure solution dans ce cas est juste d'utiliser le compte super utilisateur et demander correctement les privilèges appropriés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top