Ich war gerade ganz schön erstaunt, als ich festgestellt habe, dass bei der Installation eines mit Delphi erstellten Services der Pfad zur Datei keine Anführungszeichen enthält:
Code:
C:\program files (x86)\meineanwendung\meinservice.exe
Das führt dazu, dass wenn man eine Datei
C:\program.exe
erstellt, diese statt des Services mit entsprechenden Rechten ausgeführt wird! Ganz nebenbei funktioniert dann der eigene Service natürlich auch nicht mehr.
Auf der Suche danach, ob das Problem bekannt ist, bin ich lediglich auf diese beiden Einträge gestoßen:
http://qc.embarcadero.com/wc/qcmain.aspx?d=5728
http://qc.embarcadero.com/wc/qcmain.aspx?d=90093
Allerdings scheint sich danach nichts gerührt zu haben. Ich kann natürlich nur für Delphi bis XE sprechen, aber es kann gerne jemand mal in den neueren Versionen nachschauen.
Grundsätzlich liegt das Problem darin, dass
SvcMgr.pas: TServiceApplication.RegisterServices
intern
CreateService(...)
lediglich mit
Path := ParamStr(0)
aufruft, ohne das Ganze mit Anführungszeichen zu umschließen. Selber patchen wäre hier natürlich kein Problem, aber ich rate davon ab, denn nachher vergisst man den Patch wieder und das Problem kommt mit der nächsten Delphi-Installation wieder.
Stattdessen wäre folgender Workaround eine Lösung, indem der Service seinen Pfad direkt nach der Installation selbst korrigiert:
Delphi-Quellcode:
procedure TMyService.ServiceAfterInstall(Sender: TService);
var
reg: TRegistry;
begin
reg := TRegistry.Create(KEY_READ or KEY_WRITE);
try
reg.RootKey := HKEY_LOCAL_MACHINE;
if reg.OpenKey('\SYSTEM\CurrentControlSet\Services\' + Name, false) then
begin
// Vulnerability-Fix: In case the path contains spaces a file like c:\program.exe might be launched with system privileges
reg.WriteString('ImagePath', '"' + GetModuleName(HInstance) + '"');
// Description for the service is optional but highly recommended
reg.WriteString('Description', 'Kurze Beschreibung');
reg.CloseKey;
end;
finally
reg.Free;
end;
end;
Ich empfehle dringend jedem, der einen Service mit Delphis SvcMgr erstellt hat, diesen Fix einzubauen!