Einzelnen Beitrag anzeigen

Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#14

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

  Alt 30. Nov 2009, 14:19
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:

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
Ralf Kaiser
  Mit Zitat antworten Zitat