Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Windows Vista/7 Adminrechte für Anfänger? (https://www.delphipraxis.net/143851-windows-vista-7-adminrechte-fuer-anfaenger.html)

Shubit 27. Nov 2009 21:03

Re: Windows Vista/7 Adminrechte für Anfänger?
 
Sry Phoenix dass ich es nicht deutlicher hingeschrieben hatte ;)

danke Alfi ich glaub dass entspricht dann eher dem was ich machen will. In Grund genommen brauche ich ja nur folgendes:
Delphi-Quellcode:
function NewCoGetObject(pazName: PWideChar; pBindOptions: PBindOpts3;
         const iid: TIID; out ppv): HResult; stdcall; external 'ole32.dll'
         name 'CoGetObject';

function CoCreateInstanceAsAdmin(WndHandle: HWND; clsid: TCLSID;
    iid: TIID; out ppv): HRESULT;
var
    Bo     : TBindOpts3;
    Moniker : PWideChar;
begin
    Moniker := PWideChar(WideString('Elevation:Administrator!new:' +
                                    GuidToString(clsid)));
    FillChar(Bo, SizeOf(Bo), #0);
    Bo.hwnd          := WndHandle;
    Bo.cbStruct      := SizeOf(Bo);
    Bo.dwClassContext := CLSCTX_LOCAL_SERVER;
    Result           := NewCoGetObject(Moniker, @Bo, iid, ppv);
end;
Also ich erstelle damit ein Objekt und weise dem die Funktionen zu die ich als Admin ausführen möchte?

Kann mir jemand ein kurzes Beispiel posten? Einfach nur wie man das Objekt erstellt und dem dann sagt dass es beispielsweise einen Ordner in Program Files erstellen soll.

Ralf Kaiser 27. Nov 2009 21:08

Re: Windows Vista/7 Adminrechte für Anfänger?
 
Also mit deinem Beispiel kann ich nun sowas von überhaupt nichts anfangen...

Du musst einen eigenen COM Server erstellen (also ein extra Projekt!). Dieser enthält die Funktionen die als Admin ausgeführt werden sollen. Dann wird dieser COM Server als Admin instatiiert und Windows zeigt die UAC-Elevation-Warnung. Stimmt der Benutzer zu dann wird die aufgerufene Funktion ausgeführt, sonst nicht.

(Hast du schon einen COM-Server dessen CLSID du dem Beispielquelltext übergibst??)

--

Leider komm ich erst am Montag wieder an den nötigen Quelltext ran. Ich habs mir aber in meinen Kalender eingetragen, damit ich es nicht vergesse!

Shubit 28. Nov 2009 08:43

Re: Windows Vista/7 Adminrechte für Anfänger?
 
Hmm ... ich hab keine Ahnung von COM-Servern :(
Ich werd mir mal ein paar Tutorials dazu suchen und und schauen ob ich deinen Quelltext dann auch verstehe^^

Ralf Kaiser 30. Nov 2009 13:19

Re: Windows Vista/7 Adminrechte für Anfänger?
 
Also, ich hab mir den Quelltext um ein COM-Objekt unter Adminrechten zu erzeugen jetzt nochmal angesehen. Dieser stimmt weitgehend mit deiner Version von "CoCreateInstanceAsAdmin" überein.

Soweit so gut.

Du benötigst jetzt also zuerst das COM-Objekt, das die Funktionen enthält die mit Adminrechten ausgeführt werden sollen:

Erzeuge dazu in Delphi eine "ActiveX Library". Das ist eine DLL die COM-Objekte beinhaltet.

Füge dieser DLL ein Manifest hinzu. Das kannst du einfach machen, indem due eine Manifestdatei als Resource einbindest. Dazu erstellst du eine Textdatei (z.B. "UAC.manifest") mit folgendem Inhalt im Projektverzeichnis der DLL:

Delphi-Quellcode:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="*"
    name="UACAwareApplication"
    type="win32"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>
Dann erstellst du eine RC-Datei (z.B. "UAC.RC"), ebenfalls im Projektverzeichnis der DLL, mit der du das Manifest in die DLL einbindest:

Delphi-Quellcode:
1 24 "UAC.manifest"
Diese RC-Datei wird nun dem DLL-Projekt hinzugefügt (einfach mit der Maus in den Projektmanager ziehen). Dadurch wird die angegebene Datei "UAC.manifest" beim erzeugen der DLL als Resource in die DLL eingebunden.

Dann kannst du mit den Typenbibliothekseditor von Delphi dem COM-Objekt Methoden hinzufügen. Diese werden dann später im Admin-Kontext ausgeführt.

In der ActiveX-DLL wird eine Konstante definiert, die CLSID. Mit dieser CLSID kann das COM-Objekt aus der DLL dann später (mit deiner Funktion "CoCreateInstanceAsAdmin") erzeugt werden. Dazu übergibst du die CLSID deines COM-Servers an die Funktion und erhälst eine Referenz auf deinen COM-Server in der Variablen "ppv".

Mit dieser Referenz kannst du dann auf die Methoden die du im COM-Server definiert hast zugreifen:


Delphi-Quellcode:
procedure TFormMain.DoElevatedWork();
var
  privfunc                             : ILSPrivilegedFunctionsClass; // definiert im COM-Server
  res                                  : HResult;
begin
  // Create the COM object that executes the privileged function when UAC is turned on under Vista
  CoCreateInstanceAsAdmin(0, CLASS_LSPrivilegedFunctionsClass, IID_ILSPrivilegedFunctionsClass, privfunc);
  res := privfunc.DoElevatedWork();
  if (res = E_FAIL) then begin
    ShowMessage('FEHLER!!');
    Application.Terminate;
  end else begin
    ShowMessage('Hat geklappt!');
  end;
end;
In diesem Beispiel wird die Methode "DoElevatedWork" die im COM-Server definiert ist mit Adminrechten ausgeführt. Die Parameter CLASS_LSPrivilegedFunctionsClass und IID_ILSPrivilegedFunctionsClass sind dabei vom Typenbibliothekseditor in der DLL definiert worden (wie diese bei dir heissen hängt natürlich davon ab, wie du dein COM-Objekt in der DLL benennst!!!)

Ich hoffe, das hilft erst mal ein wenig,
Ralf

Shubit 3. Dez 2009 09:21

Re: Windows Vista/7 Adminrechte für Anfänger?
 
jo danke, kannst du noch den komplett Quelltext als zip anhängen?

Ralf Kaiser 3. Dez 2009 09:53

Re: Windows Vista/7 Adminrechte für Anfänger?
 
Zitat:

Zitat von Shubit
jo danke, kannst du noch den komplett Quelltext als zip anhängen?

Das da oben ist der komplette Quelltext (zumindest für das Erzeugen des COM-Objektes zur Laufzeit). Wichtig ist. das Manifest in die COM-DLL einzubauen und das COM-Objekt nicht, wie normal, mit MeinComObjektClass.CoCreate() zu erzeugen sondern mit der Funkktion (aus deinem Post, die stimmte fast mit meiner Version überein, natürlich waren die Variablennamen anders).

Das COM-Objekt-Projekt weiterzugeben macht keinen Sinn, da du mit den Methoden die ich in meinem COM-Objekt brauche ja nichts anfangen kannst. Da musst du schon mit Delphi eine eigene ActiveX-DLL erstellen. :wink: Delphi erzeugt ja das gesamte "Gerüst" der COM-DLL automatisch. Du musst "nur noch" deine Methoden hinzufügen und mit Leben füllen.

Ansonsten sag doch nochmal, welchen Teil des Quelltextes du benötigst.

Shubit 1. Apr 2010 08:25

Re: Windows Vista/7 Adminrechte für Anfänger?
 
also ich denke ich hab jetzt verstanden wie es funktioniert, allerdings hab ich keinen Schimmer wie ich das umsetze (wie man einen Com Objekt erstellt, es einbindet, compiliert, ...)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:57 Uhr.
Seite 2 von 2     12   

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