Znalazłem w necie coś takiego i działa .
Sama usługa działa na koncie SYSTEM i przy pomocy poniższej procedury uruchamia aplikację GUI na koncie użytkownika zalogowanego do konsoli.
procedure StartApp(const App, Parameters, CurDir: String);
var
StartupInfo: TStartupInfo;
ProcInfo: TProcessInformation;
pEnv: Pointer;
pCurDir, pCmdLine: pchar;
htoken: cardinal;
s_id: cardinal;
begin
ZeroMemory(@StartupInfo, sizeof(StartupInfo));
StartupInfo.cb := sizeof(StartupInfo);
StartupInfo.lpDesktop := 'winsta0\default';
CreateEnvironmentBlock(@pEnv, 0, true);
try
if Length(Parameters) > 0 then
pCmdLine := pchar('"' + App + '" ' + Parameters)
else
pCmdLine := pchar('"' + App + '" ');
pCurDir := Nil;
if Length(CurDir) > 0 then
pCurDir := pchar(CurDir);
s_id := WTSGetActiveConsoleSessionId;
WTSQueryUserToken(s_id, htoken);
if s_id <> $FFFFFFFF then
if not
CreateProcessAsUser( //
htoken, //
pchar(App), //
nil, //
nil, //
nil, //
false, //
SW_HIDE, //
nil, //
nil, //
StartupInfo, //
ProcInfo //
) then
raiseLastOsError;
finally
DestroyEnvironmentBlock(pEnv);
end;
// wait for 60secs
WaitForSingleObject(ProcInfo.hProcess, 60 * 1000);
// wait until process can receive user input
// WaitForInputIdle(ProcInfo.hProcess, 60*1000);
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
end;