Usługa systemowa dla Windows 7 uruchamiająca aplikację z GUI

0

Witam serdecznie

Mam pytanie

Czy macie może jakiś tutorial, faq, albo fragment kodu dla zdarzenia onExcute usługi systemowej zgodnej z Windows 7 , która służy do uruchamiania aplikacji z GUI ?
Mecze się z tym już dwa dni w C++ Builder i nie idzie. Doszedłem do momentu uruchamiania mojego programu przez usługę na sesji 0 i klops ... zaciemnienie nastało :-)

Pozdrawiam

#max

0

Jeśli piszesz to w C++, to pomyliłeś działy; Albo wstaw do tagów wątku np. delphi, albo daj znać, to wątek się przeniesie do odpowiedniego działu;

PS: Znak # na początku linii służy do tworzenia listy numerowanej, więc Twój podpis stał się listą.

1

W usłudze musisz wykorzystać CreateProcessAsUser zamiast standardowego CreateProcess.

Więcej informacji:
http://www.codeproject.com/Articles/18367/Launch-your-application-in-Vista-under-the-local-s

1

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;
0
furious programming napisał(a):

Jeśli piszesz to w C++, to pomyliłeś działy; Albo wstaw do tagów wątku np. delphi, albo daj znać, to wątek się przeniesie do odpowiedniego działu;

PS: Znak # na początku linii służy do tworzenia listy numerowanej, więc Twój podpis stał się listą.

Napisałem tutaj, ponieważ nie ma podziału na forum na aplikacje pisane w środowiskach firmy Embarcadero (wywodzących się z środowisk firmy Borland). Ze wzg na fakt że i Builder (C++) i Delphi (Object Pascal) korzystają z bardzo zbliżonych komponentów, które nie występują w Visual Studio (C++) czy ANSI C++ z np. Dev C++ pytam się tutaj, gdyż osobiście nie mam problemu w przepisaniu kodu z Delphi na C++ Builder i vice versa, a kwestia prawie takich samych komponentów i bardzo zbliżonych metod myślę że to dodatkowo motywuje.

2

Odpowiedź dostałeś, a jest to dlatego utrudnione, ponieważ usługa z zasady nie powinna wyświetlać żadnego GUI.
Możesz napisać program konfigurujący usługę, ale nie powinno się robić odwrotnie (że to usługa coś uruchamia).

1 użytkowników online, w tym zalogowanych: 0, gości: 1