![]() |
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 ![]() 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:
Was könnte das sein?
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; THX P.S. Ich hoffe jemand kann etwas dazu erzählen. |
Re: UAC-Elevation ClassFactory: An die COM-Kenner
*push*
|
Re: UAC-Elevation ClassFactory: An die COM-Kenner
Sorry, habe gerade nicht genug Zeit, aber lade Dir mal die DevTracks Spring 2007 von
![]() ...:cat:... |
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. |
Re: UAC-Elevation ClassFactory: An die COM-Kenner
Zitat:
...:cat:... |
Re: UAC-Elevation ClassFactory: An die COM-Kenner
Ich hab schon oben den Link dazu gegeben
![]() 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. |
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