Frage

Ich entwickle ein COM Surrogat Objekt in C, wird es durch meine Anwendungen verwendet werden, um die UAC-Dialog für bestimmte Aktionen aufrufen, die Administratorrechte benötigen.

Der Plan ist, dies zu machen, eine Funktion exportieren, die einen Zeiger auf eine Funktion mit einer variablen Anzahl von Argumenten und führt sie in einem anderen Kontext nimmt. Auf diese Weise kann eine Anwendung dieses Objekt verwenden, können einige Aktionen mit Admin-Rechten auszuführen, alles, was sie tun müssen, ist die Verwendung dieses Objekt und einen Zeiger auf die Funktion übergeben, die mit den Rechten ausgeführt werden muss.

Das funktioniert teilweise, ruft CoCreateInstance geht in Ordnung, die Funktionszeiger übergeben und meine Funktion ausgeführt wird. Allerdings, wenn ich eine Instanz dieses Objekts mit CoCreateInstanceAsAdmin , treten Probleme auf; hier ist der 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;
}

Der Aufruf CoCreateInstanceAsAdmin nicht mit "Klasse nicht registriert".

Das Objekt wird registriert, indem die folgenden Registrierungsschlüssel zu schaffen (hier ist der Körper der REG-Datei)


[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]

Ich nehme an, dass einige Registrierungseinträge fehlen - dass die Schlussfolgerung den ich erreichen, wenn die Fehlermeldung zu lesen. Allerdings wurde diese Liste des Registrierungsschlüssels erstellt, nachdem die Dokumentation auf MSDN und anderen Websites zu erkunden -. So dass ich ziemlich sicher bin, dass nichts übersehen wurde

Unter den Dingen, die ich habe versucht, dies zu lösen, ist es über ATL zu implementieren (so dass Registrierung automatisiert). Das funktioniert, aber das Problem ist, dass ich keinen funtion Zeiger auf den MIDL generierte Funktionsprototyp passieren kann.

Ich habe versucht, es zu passieren mit dem VARIANT Typ:


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

als Ergebnis I "Invalid argument Typen" erhalten.

Könnte jemand etwas Licht auf das Thema werfen? Vielleicht, was ich nicht für möglich zu erreichen versuchen, durch Design?

Keine korrekte Lösung

Andere Tipps

Ich glaube, die Probleme, die Sie haben, werden durch Design ist und dass die Absicht des Fensters Sicherheitsverbesserungen wurden zur Vermeidung von potenziellen Sicherheitsrisiken.

Microsoft nicht wirklich wollen Sie Ihre Privilegien zu erweitern, wenn es Sie zu tun, so zu stoppen. Ausführen von beliebigen Funktionen als privilegierten Benutzer sollte in irgendeiner Weise nicht einfach sein, wenn Windows sogar ein anständig gesichert System ist. Vielleicht haben Sie könnten versuchen, einen anderen Benutzeridentitätswechsel-Token und bekommen einen besseren Zugang auf diese Weise, aber selbst dann wäre es eine Strecke sein. Wenn ich mich recht erinnere, wird der Benutzer Verkörperungen nicht einmal garantieren, dass Sie vollen Zugriff bekommen. Die beste Lösung ist in diesem Fall nur das Super-Benutzerkonto zu verwenden und fordern Sie richtig die richtigen Berechtigungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top