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