Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi UAC-Elevation ClassFactory: An die COM-Kenner (https://www.delphipraxis.net/101366-uac-elevation-classfactory-die-com-kenner.html)

Dezipaitor 11. Okt 2007 23:52


UAC-Elevation ClassFactory: An die COM-Kenner
 
Ich implementiere gerade UAC Elevation und hab es auch eigentlich geschafft.
Jetzt gibt es aber noch die Möglichkeit laut http://msdn2.microsoft.com/en-us/library/ms679687.aspx
mit "Elevation:Administrator!clsid:{guid}" eine IClassFactory zu implementieren, mit der man dann Objekte elevated erstellen kann.

Dafür muss ich eine TypeLibrary erstellen, die ein Objekt enthält, welches von IClassFactory abgeleitet ist. Es sind aber nur ganz wenige Ableitung (IUnknown, IDispatch...)
vorhanden.

Deshalb habe ich mal probehalber die Methoden der IClassFactory einfach in eine eigenes Interface portiert - über den TBL-Editor und implementiert - komisch, geht aber net anders.
Die Typelibrary definiert das Interface IElevationDemoObject, welches ich dann ableite und implementiere (nur Testausgaben).

Der Test schlägt in CoGetClassFactoyAsAdmin::CoCreateInstanceAsEx::CoG etObject fehl mit OleSysError "Schnittstelle nicht unterstützt" und zwar nachdem der Elevationprompt kam.
Ich erstelle hier sozusagen die Classfactory und sag ihr einfach: Gib mir ein Pointer auf dich selbst.

Das ganze funktioniert übrigens, wenn in CoCreateInstanceAsEx CoCreateInstance ausgeführt wird.

Delphi-Quellcode:
var
  ElevatedObject2,
  ElevatedObject: IElevationDemoObject;

 CoGetClassFactoyAsAdmin(
    GetForegroundWindow,
    CLASS_ElevationDemoObject,
    IID_IElevationDemoObject,
    ElevatedObject); <<-- Fehler

  if ElevatedObject.CreateInstance(nil,IID_IElevationDemoObject,IUnknown(ElevatedObject2)) = S_OK then
    ElevatedObject2.DoTest;
....


procedure CoGetClassFactoyAsAdmin(
  const ParentWindowHandle: HWND;
  const ClassId: TGUID;
  const IID: TGUID;
  out ObjectInterface);
begin
  CoCreateInstanceAsEx(
    'Elevation:Administrator!clsid:', ParentWindowHandle, ClassId, IID, ObjectInterface);
end;

procedure CoCreateInstanceAsEx(
  const MonikerSequence : WideString;
  const ParentWindowHandle: HWND;
  const ClassId: TGUID;
  const IID: TGUID;
  out ObjectInterface);
var
  MonikerName : WideString;
  BindOptions : TBindOpts3;
  Token : TJwSecurityToken;
  iLen : Cardinal;
begin
  Token := TJwSecurityToken.CreateTokenEffective(TOKEN_QUERY or TOKEN_READ);

  try
    if Token.RunElevation = 0 then
    begin
      MonikerName := MonikerSequence + GUIDToString(ClassId);

      iLen := SizeOf(TBindOpts3);
      FillChar(BindOptions, iLen, 0);

      BindOptions.cbStruct := iLen;
      BindOptions.dwClassContext := CLSCTX_LOCAL_SERVER;
      BindOptions.hwnd := ParentWindowHandle;

      OleCheck(CoGetObject(PWideChar(MonikerName), @BindOptions, IID, ObjectInterface));
    end
    else
    begin
      OleCheck(CoCreateInstance(ClassID, nil, CLSCTX_ALL, IID, ObjectInterface));
    end;
  finally
    Token.Free;
  end;
end;
Was könnte das sein?

THX

P.S.
Ich hoffe jemand kann etwas dazu erzählen.

Dezipaitor 12. Okt 2007 18:36

Re: UAC-Elevation ClassFactory: An die COM-Kenner
 
*push*

sakura 13. Okt 2007 18:30

Re: UAC-Elevation ClassFactory: An die COM-Kenner
 
Sorry, habe gerade nicht genug Zeit, aber lade Dir mal die DevTracks Spring 2007 von meinem Blog runter, da ist ein vollständiges Beispiel dabei ;)

...:cat:...

Dezipaitor 13. Okt 2007 18:44

Re: UAC-Elevation ClassFactory: An die COM-Kenner
 
Hehe, die "einfachen" Sachen hab ich auch schon erledigt.

Was ich aber wissen will, wie man "Elevation:Administrator!clsid:" verwendet.
Du verwendest ja "Elevation:Administrator!new:" .

Man kann anscheinend eine Klassenfabrik erstellen, die dan Instanzen von Klassen erstellt, die erhöhte Rechte haben. Ob man diese Klassen jedoch auch registrieren muss, weiß ich nicht.

sakura 13. Okt 2007 19:16

Re: UAC-Elevation ClassFactory: An die COM-Kenner
 
Zitat:

Zitat von Dezipaitor
Man kann anscheinend eine Klassenfabrik erstellen, die dan Instanzen von Klassen erstellt, die erhöhte Rechte haben. Ob man diese Klassen jedoch auch registrieren muss, weiß ich nicht.

Kann ich mir nur schwer vorstellen, da die gesamte Bibliothek als Prozess geladen wird und einen "normal" geladenen Prozess kann man anschließend nicht mehr auf die administrative Ebene anheben :gruebel: Wenn Du es aber doch schaffst, dann will ich es wissen. Wo hast Du Infos dazu gelesen?

...:cat:...

Dezipaitor 13. Okt 2007 19:21

Re: UAC-Elevation ClassFactory: An die COM-Kenner
 
Ich hab schon oben den Link dazu gegeben

http://msdn2.microsoft.com/en-us/library/ms679687.aspx

Suche nach: "Elevation:Administrator!clsid:{guid}"


Leider bin ich nicht so bewandert in COM, auch wenn ich es schon oft genutzt habe. COM + diese neue Art ist jedoch sehr schwierig.

Shivan 25. Feb 2010 08:57

Re: UAC-Elevation ClassFactory: An die COM-Kenner
 
@sakura

Deine Beispiele von den DevTracks sind genau das was ich nun schon eine Weile gesucht habe.
Im Internet schwirren mehrere IsUserAdmin-Beispiele herum, jedoch deine funktioniert :)

Danke fürs zur Verfügung stellen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz