100% рабочий код. Сам сервис запускается из-под конкретного пользователя.
В противном случае нужно эти права получать програмным путём.
TServ = class(TService)
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceExecute(Sender: TService);
procedure ServiceCreate(Sender: TObject);
public
function GetServiceController: TServiceController; override;
end;
procedure TServ.ServiceExecute(Sender: TService);
var
si : TStartupInfo;
pi : TProcessInformation;
begin
FillMemory( @pi, SizeOf( pi ), 0 );
GetStartupInfo( si );
CreateProcess(PAnsiChar(exe), PAnsiChar(params), nil, nil, false, 0, nil, PAnsiChar(dir), si, pi );
CloseHandle(pi.hThread);
while not Terminated do begin
ServiceThread. ProcessRequests( False );
Sleep(250);
end;
TerminateProcess(pi.hProcess, 1);
end;