Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Beliebiges Programm als Service? (https://www.delphipraxis.net/36875-beliebiges-programm-als-service.html)

quirks 27. Dez 2004 15:57


Beliebiges Programm als Service?
 
Hm, hab da ein Problem: Wie kann ich ein beliebiges Win16/32 Programm als Service unter 2000/XP starten?
Es gibt da zwar Programme, die das können, aber die kosten Geld. Und ich möchte das in ein Deploy-Paket für Software mitreinstecken.
Hier im FOrum gibts zwar viel über Services, aber nix zu meinem Problem.

Wäre nett, wenn jemand mir helfen könnte.

Assarbad 27. Dez 2004 19:09

Re: Beliebiges Programm als Service?
 
Man schreibe sich einfach einen Service, der genau tut was du willst ...

BTW: Mein Tutorial enthält ein Beispiel, welches exakt dies tut, nur eben mit eine hardcodeten Applikation (cmd.exe). Du müßtest es also nur so umbauen, daß es konfigurierbar wird.

quirks 27. Dez 2004 19:16

Re: Beliebiges Programm als Service?
 
danke für die hilfe.

hab gedacht, das wäre um einiges komplizierter!
dann werd ich mich mal dranmachen...

Assarbad 27. Dez 2004 19:18

Re: Beliebiges Programm als Service?
 
Ganz nach Programm mußt du noch entscheiden, ob der Service interaktiv oder nicht interaktiv sein soll. Einmal wird dann ein Fenster erscheinen, im anderen Fall nicht.

Jelly 27. Dez 2004 19:35

Re: Beliebiges Programm als Service?
 
Um bestehende Anwendungen als Service laufen zu lassen kannst du dir mal Firedaemon anschauen.

Assarbad 27. Dez 2004 21:01

Re: Beliebiges Programm als Service?
 
Zitat:

Zitat von Jelly
Um bestehende Anwendungen als Service laufen zu lassen kannst du dir mal Firedaemon anschauen.

Bisserl teuer für ein "lumpiges" Programm zum Starten von Programmen als Services *g* :mrgreen:

Hatte das Ding auch schonmal gesehen. Ich werde vielleicht mal ne OpenSource-Variante für so ein Programm schreiben ;)

supermuckl 27. Dez 2004 21:03

Re: Beliebiges Programm als Service?
 
wird da nicht einfach nur ein shellexecute von einem service aus gemacht?
dann rennt die gestartete anwendung auch unsichtbar. ist das dann auch locker gesehen ein service oder einfach nur unsichtbar?
obwohl diese applikationen dann fenster haben, werden sie nicht angezeigt.. manche geben deshalb fehler und stürzen ab

hab das mal selbst probiert ;)

Assarbad 27. Dez 2004 21:14

Re: Beliebiges Programm als Service?
 
Zitat:

Zitat von supermuckl
wird da nicht einfach nur ein shellexecute von einem service aus gemacht?
dann rennt die gestartete anwendung auch unsichtbar. ist das dann auch locker gesehen ein service oder einfach nur unsichtbar?

Es ist KEIN Service. Services zeichnen sich dadurch aus, daß ein bestimmter Einsprungspunkt dem SCM die volle Macht über den Service gibt. Ähnlich wie auch bei einem Treiber.

Zitat:

obwohl diese applikationen dann fenster haben, werden sie nicht angezeigt.. manche geben deshalb fehler und stürzen ab)
Das Problem ist oft genug nicht, daß diese Programm u.U. Eingaben erwarten. Aber WinSta0 ist die einzige WindowStation, welche Zugriff auf Keyboard/Maus hat!
Außerdem kommt es drauf an, wie man sich anstellt. Normalerweise soll man Services NIE als interaktiv laufen lassen. Stattdessen sollen sich die Services über Manipulation an den ACLs für Desktop/WindowStation und durch SetProcessWindowStation()/SetThreadDesktop() Zugriff auf den Desktop verschaffen. Oder gar durch "Impersonation". Das Problem ist nämlich, daß interaktive Dienste, so sie anfällig sind (zB Shatter-Attack) und unter SYSTEM-Kontext laufen, quasi volle Rechte auf das System gewähren.

emsländer 27. Dez 2004 21:31

Re: Beliebiges Programm als Service?
 
Hi,

geht noch einfacher. Die beiden von M$ dafür vorgesehenen Tools sind INSTSRV und SRVANY aus dem Resource Kit

Gruss

EL

Assarbad 27. Dez 2004 21:56

Re: Beliebiges Programm als Service?
 
Zitat:

Zitat von emsländer
geht noch einfacher. Die beiden von M$ dafür vorgesehenen Tools sind INSTSRV und SRVANY aus dem Resource Kit

... welches nicht frei ist!

emsländer 27. Dez 2004 21:58

Re: Beliebiges Programm als Service?
 
Zitat:

Zitat von Assarbad
Zitat:

Zitat von emsländer
geht noch einfacher. Die beiden von M$ dafür vorgesehenen Tools sind INSTSRV und SRVANY aus dem Resource Kit

... welches nicht frei ist!

Stimmt -


Gruss

EL

jensw_2000 27. Dez 2004 22:22

Re: Beliebiges Programm als Service?
 
Aber der Invoker ist kostenlos und funktioniert super...

Schöne Grüße,
Jens

:hi:

ralfiii 13. Feb 2012 12:36

AW: Re: Beliebiges Programm als Service?
 
...ist lange her, ich werd den Thread mal wiederbeleben.
Ich brauche eben das: Ein Programm als Dienst laufen lassen.

Ich hab hier von sc.exe gelesen.
Ich hab nun eine 1-Formular-Mini-Applikation (In OnCreate erzeugt sie ein File, in onDestroy ein anderes) gemacht und mal als Dienst registriert.

Click ich in der Dienste-Fenster auf "Dienst starten", dann läuft der Progressbar eine Zeit lang, OnCreate wird offensichtlich ausgeführt, dann aber hängt der Progrssbar lang bei ca. 50% und dann kommt

"Der Dienst "Test" auf "Lokaler Computer" konnte nicht gestartet werden.
Fehler 1053: Der Dienst antwortete nicht rechtzeitig auf die Start- oder Steuerungsanforderung."

Hat jemand eine Idee?
Danke!

Klaus01 13. Feb 2012 12:46

AW: Beliebiges Programm als Service?
 
.. soweit ich weiß sind interaktive Services seit Windows XP nicht mehr gestattet.

Einen richtigen Serivice zu bauen ist mit Delphi auch kein Hexenwerk.

Grüße
Klaus

jaenicke 13. Feb 2012 13:04

AW: Beliebiges Programm als Service?
 
Um genau zu sein waren interaktive Dienste schon immer nur eine Notlösung, konnten aber bis XP dennoch aktiviert werden. Seit Vista ist diese extreme Sicherheitslücke endlich komplett gestopft, indem interaktive Dienste gar nicht mehr erlaubt sind.

Zitat:

Zitat von ralfiii (Beitrag 1150768)
Ich hab nun eine 1-Formular-Mini-Applikation (In OnCreate erzeugt sie ein File, in onDestroy ein anderes)

Und was daran braucht da ein Formular? :?
In einer Serviceanwendung kannst du einfach das Start- und Ende-Event des Dienstes benutzen und fertig. Schau einfach mal in die Liste der Events, wenn du eine Serviceanwendung in Delphi erstellt hast. ;-)

tinof 13. Feb 2012 13:07

AW: Beliebiges Programm als Service?
 
Ich habe gute Erfahrungen mit dem -kostenpflichtigen, aber erschwinglichen- Programm "Application As Service" gemacht.

Das ist gut geeignet, um eine Desktop - Anwendung mal schnell als Service auszuführen. Natürlich muß diese automatisch 'laufen', Benutzerinteraktionen können nur beim Start und Beenden des "Services" mitgegeben werden.

Grüße
Tino

ralfiii 13. Feb 2012 16:12

AW: Beliebiges Programm als Service?
 
Zitat:

Zitat von jaenicke (Beitrag 1150773)
Zitat:

Zitat von ralfiii (Beitrag 1150768)
Ich hab nun eine 1-Formular-Mini-Applikation (In OnCreate erzeugt sie ein File, in onDestroy ein anderes)

Und was daran braucht da ein Formular? :?

Ich brauch das Formular natürlich nicht, das war nur zum Testen.
Es geht hier um eine Installation einer alten Version unserer Software.
Da gab's ein Tool, das (nicht sonderlich smart) im Autostart aufgerufen wurde und sich dann in der Taskleiste eingenistet hat.
In der aktuellen Version der Software ist dieses Tool bereits ein Service, ich will dem Kunden aber nicht die neue Version installieren müssen.

Daher wollte ich die alte Anwendung (die ein Fenster hat, das aber nicht sichtbar zu sein braucht) als Service starten.

Heisst das, dass man mit cs.exe nur Anwendungen ohne WinHandles als Dienst starten kann?
Oder warum kommt diese Fehlermeldung?

Danke

joachimd 13. Feb 2012 16:16

AW: Beliebiges Programm als Service?
 
Zitat:

Zitat von ralfiii (Beitrag 1150850)
Ich brauch das Formular natürlich nicht, das war nur zum Testen.

Cary Jensen hat mal in einem (oder mehreren) Vortrag zur Dienste-Entwicklung einen netten Trick gezeigt: Du baust die komplette Funktionalität in ein Daten-Modul. Zum Test kannst Du eine VCL-Forms-App erzeugen, die das Datenmodul erzeugt und Ausgaben visualisiert ... als Service baust du eine Service-Anwendung, die das Datenmodul nur erzeugt und automatisch rennen lässt.

jaenicke 13. Feb 2012 16:26

AW: Beliebiges Programm als Service?
 
Ich mache das in einer Anwendung, die man als Dienst installieren und verwenden kann, aber auch normal starten.
Stichworte: schauen, ob die Exe von der services.exe gestartet wird, ob sie /install oder /uninstall als Parameter hat, dann entweder TServiceApplication oder TApplication, ...

ralfiii 13. Feb 2012 16:33

AW: Beliebiges Programm als Service?
 
Zitat:

Zitat von joachimd (Beitrag 1150853)
Cary Jensen hat mal in einem (oder mehreren) Vortrag zur Dienste-Entwicklung einen netten Trick gezeigt: Du baust die komplette Funktionalität in ein Daten-Modul.

So ähnlich ist das in der aktuellen Version der Software gelöst - da ist alles in einem Handler-Objekt verpackt.
Aber für diesen Kunden MUSS es die alte Version sein.
Und bei der möchte ich die Sourcen möglichst unangetastet lassen.

himitsu 13. Feb 2012 16:40

AW: Beliebiges Programm als Service?
 
Oder andersrum.

Man baut einen Service, welcher sich (über einen Parameter, bzw. über eine Debugger-Erkennung) als normales Programm startet.
So hab ich das mit dem Service unsere unserer Produktes auch gehandhabt.

[edit]
Delphi-Quellcode:
unit MyServiceDataModul;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, SvcMgr, Math, AppEvnts, Registry, Dialogs, ExtCtrls, Types, StdCtrls;

type
  TMyService = class(TService)
    function GetServiceController: TServiceController; override;
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceExecute(Sender: TService);
    procedure DebugServiceClose(Sender: TObject; var CanClose: Boolean);
  end;

var
  MyService: TMyService;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  MyService.Controller(CtrlCode);
end;

function TMyService.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

type
  TServiceApplicationHack = class(TServiceApplication);

procedure TMyService.ServiceCreate(Sender: TObject);
var
  Started: Boolean;
  Temp:   TForm;
begin
  if IsDebuggerPresent or FindCmdLineSwitch('DEBUG', ['-', '/'], True) then begin
    Forms.Application.MainFormOnTaskBar := False; // geht leider doch nicht ohne Form
    Forms.Application.CreateForm(TForm, Temp);   // Form zum Beenden und für Eintrag in Taskbar
    Temp.Caption     := 'Debug-Mode: ' + SvcMgr.Application.Title;
    Temp.OnCloseQuery := DebugServiceClose;
    Temp.Visible     := True;
    { SvcMgr.Application.Run; }
    {}if FindCmdLineSwitch('INSTALL', ['-', '/'], True) then
    {}  TServiceApplicationHack(Application).RegisterServices(True, FindCmdLineSwitch('SILENT', ['-', '/'], True))
    {}else if FindCmdLineSwitch('UNINSTALL', ['-', '/'], True) then
    {}  TServiceApplicationHack(Application).RegisterServices(False, FindCmdLineSwitch('SILENT', ['-', '/'], True))
    {}else begin
    {}  Started := True;
    {}  ServiceStart(Self, Started);
    {}  if Started then
    {}    while not Terminated do begin
    {}      Forms.Application.ProcessMessages;
    {}      Sleep(20);
    {}    end;
    {}  Forms.Application.Terminate;
    {}end;
  end;
end;

procedure TMyService.ServiceStart(Sender: TService; var Started: Boolean);
begin
  try

    ...

  except
    on E: Exception do begin
      Started  := False;
      ErrCode  := 666;
      E.Message := 'Service konnte nicht gestartet werden.' + sLineBreak + E.Message;
      raise;
    end;
  end;
end;

procedure TMyService.ServiceExecute(Sender: TService);
begin
  while not Terminated do
    try
      ServiceThread.ProcessRequests(False);
    except
      on E: Exception do begin
        LogEvent('Es ist ein nicht abgefangener Fehler aufgetreten.', E);
        Sleep(500);
      end;
    end;
end;

procedure TMyService.DebugServiceClose(Sender: TObject; var CanClose: Boolean);
begin
  if Assigned(MyService) and Assigned(MyService.ServiceThread) then
    MyService.ServiceThread.Terminate;
end;

end.

ralfiii 6. Mär 2012 12:26

AW: Beliebiges Programm als Service?
 
Yeah!
Es geht ja doch!!!

Hier eine kleine Anleitung:
http://www.mcseboard.de/windows-foru...ml#post1113084

Man braucht beide, srvany und sc. Beide gemeinsam machen's möglich und stören sich auch nicht daran, wenn sich die Anwendung nicht an die Richtlinien für einen Dienst hält. (es geht also auch, selbst wenn die App ein Hauptfenster hat und so einiges in OnShow macht).

Man sollte nur im Hinterkopf behalten, dass die Anwendung bei Dienst-Stop einfach gekillt wird. Also kein OnDestroy, OnClose oder dergleichen.

hth,
Ralf


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz