Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Wie Remote Update eine Windows-Service? (https://www.delphipraxis.net/188475-wie-remote-update-eine-windows-service.html)

sh17 8. Mär 2016 05:46

Wie Remote Update eine Windows-Service?
 
Gegeben ist ein lokales Netzwerk. Wie kann man am elegantesten einen auf dem Server laufenden Windows Service von einem Client aus aktualisieren?

Momentan überlege folgenden Ablauf:

- Neue Exe an den Windows Service übertragen
- Den Service veranlassen eine Windows Aufgabe zu starten, welche den Service stoppt, eine andere Exe aufruft, die das Update installiert und den Service wieder startet.

Gibt es elegantere Lösungen?
Kann ein Service überhaupt eine Aufgabe starten?

Vielen Dank für Anregungen.

mkinzler 8. Mär 2016 07:48

AW: Wie Remote Update eine Windows-Service?
 
Oder einen 2. Updatedienst einrichten, welcher diese Aufgabe übernimmt.

Ulrich Berger 8. Mär 2016 09:07

AW: Wie Remote Update eine Windows-Service?
 
Also wir haben das bei uns ganz pragmatisch gelöst... es wurde eine Freigabe eingerichtet, so dass man aus dem Netz auf den Installationsordner des Services zugreifen und die Exe austauschen kann... außerdem läuft auf dem Server ein vnc Server, um sich mit dem Server verbinden und den Dienst vor dem Austausch stoppen zu können.

Gruß Uli

nahpets 8. Mär 2016 09:09

AW: Wie Remote Update eine Windows-Service?
 
Schau Dir bitte mal den Kommandozeilenbefehl sc an.

Damit kann man u. a. Services starten und stoppen, auch auf "fremden" Rechnern.

Dein Problem müsste sich somit per Batchdatei lösen lassen.

Ungetestet und nur vermutet in etwa sowas:
Code:
sc \\Server stop "service name"
copy Service.exe \\Server\Pfad\Service.exe
sc \\Server start "service name"
Literatur dazu:

SC Start
http://superuser.com/questions/31516...the-difference

sh17 8. Mär 2016 09:46

AW: Wie Remote Update eine Windows-Service?
 
Zitat:

Zitat von Ulrich Berger (Beitrag 1332355)
Also wir haben das bei uns ganz pragmatisch gelöst... es wurde eine Freigabe eingerichtet, so dass man aus dem Netz auf den Installationsordner des Services zugreifen und die Exe austauschen kann... außerdem läuft auf dem Server ein vnc Server, um sich mit dem Server verbinden und den Dienst vor dem Austausch stoppen zu können.

Leider zu pragmatisch, zuviel Handarbeit.

SC wäre eine Alternative, muss ich mal schauen, ob das Remote klappt. Müssen dazu auf dem Server irgend welche Rechte gesetzt werden, das man sowas darf?

mkinzler 8. Mär 2016 09:47

AW: Wie Remote Update eine Windows-Service?
 
Der Benutzer muss Adminrechte auf dem remoten Server besitzen

nahpets 8. Mär 2016 09:51

AW: Wie Remote Update eine Windows-Service?
 
Ich gehe mal davon aus, dass der Nutzer, der SC ausführt, das Recht haben muss, auf dem Server Dienste zu starten und zu beenden und Schreibrechte für das Verzeichnis benötigt, in dem die Service.exe liegt.

sh17 8. Mär 2016 10:03

AW: Wie Remote Update eine Windows-Service?
 
Hmm, ich glaub, das ist auch schon wieder nix. Ich glaub nicht, dass das Admin-Passwort immer verfügbar ist. Bleibt wohl nur ein Update-Dienst.

Oder kann ein Dienst ein Windows Task anwerfen?

nytaiceman 8. Mär 2016 10:32

AW: Wie Remote Update eine Windows-Service?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Der Ansatz mit einem zweiten Dienst zu arbeiten habe ich auch schon verfolgt.

UpdateService mit einem Timer versehen. Der Timer prüft regelmässig ob eine aktuellere Version des Arbeitsdienstes rumliegt und führt wenn nötig eine Aktualisierung durch:

Delphi-Quellcode:
// === Timer - UpdateCheck =====================================================
procedure TnwUpdateService.OnUpdateCheckTimer(Sender: TObject);
var
 ServiceManager: TServiceManager;
 oldName, NewName, UpdFile : String;
 tts : Integer;
begin
 newname := GetScriptDir +'\n_Server.old';
 oldname := GetScriptDir +'\n_Server.exe';
 updfile := GetScriptDir +'\n_DataServer\n_Server.exe';

// WriteLog('Updatechecker','Check on every 30s');

// = Check for local update
 if Fileexists(updfile) then
  begin
   WriteLog('Updatechecker','Found Update for "n_DataServer.exe"');
   ServiceManager := TServiceManager.Create;
   ServiceManager.Connect;
   ServiceManager.OpenServiceConnection('nwDataServer');

   with ServiceManager do begin
    // Stoping Service if it is running

     if ServiceRunning then
     begin WriteLog('Updatechecker','Trying to stop "n_DataServer.exe"'); StopService; end else WriteLog('Updatechecker','Is not running: "n_DataServer.exe"');

     // = Check repeatetly
      tts := 0;
      repeat
       tts := tts +1;
       sleep(1000)
      until (tts > 30) OR (Servicemanager.ServiceStopped);

     If Servicemanager.ServiceStopped then WriteLog('Updatechecker','was or is stopped: "n_DataServer.exe"') else
      begin
       WriteLog('Updatechecker','[ERROR] Could not stop "n_DataServer.exe"');
       exit;
      end;

    // = Replace current server.exe with the new one
     WriteLog('Updatechecker','Current Version was: ' +fGetFileVersion(oldname));
     WriteLog('Updatechecker','New Version is    : ' +fGetFileVersion(updfile));

    // = Rename current server.exe to server.old
     if Fileexists(newname) then DeleteFile(newname);
     sleep(100);
     newName := ChangeFileExt(oldName, '.old');
     sleep(100);
     RenameFile(oldName, newName);
     sleep(100);

    // = Move update.exe to currentdir
     MoveFile(PChar(updfile),PChar(oldname));
     sleep(100);

    // = Start Service
     if ServiceStopped then begin
      WriteLog('Updatechecker','Trying to start "n_DataServer.exe"');
      StartService;
     end;

     sleep(100);

     // = Check repeatetly
      tts := 0;
      repeat
       tts := tts +1;
       sleep(1000)
      until (tts > 30) OR (Servicemanager.ServiceRunning);

     If Servicemanager.ServiceRunning then WriteLog('Updatechecker','Is running: "n_DataServer.exe"') else
      begin
       WriteLog('Updatechecker','[ERROR] Could not start "n_DataServer.exe"');
       exit;
      end;

   end;

   // = Free the instance
   FreeAndNil(ServiceManager);

  end;

end;
Im Anhang die ServiceManager.pas welche mal irgendwo gefunden habe.

:duck: Bitte nicht mit Prügel aufwarten, mein Code hat sicher Optimierungspotential...

mkinzler 8. Mär 2016 10:38

AW: Wie Remote Update eine Windows-Service?
 
Wobei dieses Vorgehen doch grundsätzlich ein hohes Sicherheitsrisiko birgt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:01 Uhr.
Seite 1 von 2  1 2      

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