AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Wie Remote Update eine Windows-Service?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie Remote Update eine Windows-Service?

Ein Thema von sh17 · begonnen am 8. Mär 2016 · letzter Beitrag vom 9. Mär 2016
Antwort Antwort
Ulrich Berger

Registriert seit: 19. Jan 2004
Ort: Herten
29 Beiträge
 
Delphi 2007 Enterprise
 
#1

AW: Wie Remote Update eine Windows-Service?

  Alt 8. Mär 2016, 09:07
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
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.679 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Wie Remote Update eine Windows-Service?

  Alt 8. Mär 2016, 09:46
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?
Sven Harazim
--
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.874 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Wie Remote Update eine Windows-Service?

  Alt 8. Mär 2016, 09:47
Der Benutzer muss Adminrechte auf dem remoten Server besitzen
Markus Kinzler
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

AW: Wie Remote Update eine Windows-Service?

  Alt 8. Mär 2016, 09:51
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.
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.679 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Wie Remote Update eine Windows-Service?

  Alt 8. Mär 2016, 10:03
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?
Sven Harazim
--
  Mit Zitat antworten Zitat
nytaiceman

Registriert seit: 15. Dez 2005
Ort: Schweiz, Bern
58 Beiträge
 
Delphi XE3 Professional
 
#6

AW: Wie Remote Update eine Windows-Service?

  Alt 8. Mär 2016, 10:32
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.

Bitte nicht mit Prügel aufwarten, mein Code hat sicher Optimierungspotential...
Angehängte Dateien
Dateityp: pas ServiceManager.pas (4,0 KB, 8x aufgerufen)
Einfach ist nur einfach, wenn Einfach auch einfach ist!
Vermeintlich einfache Workarounds führen irgendwann zu Problemen!

Geändert von nytaiceman ( 8. Mär 2016 um 10:35 Uhr) Grund: Anhang ServiceManager.pas vergessen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.874 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Wie Remote Update eine Windows-Service?

  Alt 8. Mär 2016, 10:38
Wobei dieses Vorgehen doch grundsätzlich ein hohes Sicherheitsrisiko birgt.
Markus Kinzler
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

AW: Wie Remote Update eine Windows-Service?

  Alt 8. Mär 2016, 10:40
Warum den Admin nehmen?

Ich würd' auf dem Server einen Benutzer anlegen (lassen), der genau die Aufgabe hat, den Dienst zu starten und zu stoppen und Lese- und Schreibrechte im Verzeichnis der Service.exe hat.

Mit diesem User wird dann der Austausch des Services vorgenommen. Dafür braucht man nicht den Admin zu bemühen.

Alternative:

Wenn im Service die Version seiner selbst bekannt ist, so könnte der Service doch zu einem definierten Zeitpunkt (täglich 3:00 Uhr oder sowas) an einer definierten Stelle nachschauen, ob es eine neue Version seiner Selbst gibt ('ne Textdatei oder sowas).

Steht dort, dass es eine neue Version gibt, so startet er selbst per ShellExecute die oben vorgeschlagene Batchdatei.

Die beendet ihn dann, kopiert die neue Service.exe und starte den Dienst dann.

andere Alternative:

Der Service prüft, ob an einer bestimmten Stelle eine Datei liegt, die den gleichen Dateinamen hat, wie erst selbst, dann wird die Batchdatei gestartet, zusätzlich löscht die Batchdatei nach dem Kopieren noch die "Quelldatei".

Das könnte dann etwa so aussehen:
Code:
sc stop "service name"
copy \\Quellrechner\Pfad\Service.exe Service.exe
del \\Quellrechner\Pfad\Service.exe
sc start "service name"
\\Quellrechner\Pfad\Service.exe könnte natürlich auch 'ne für den Service verfügbare Freigabe sein.

Oder wenn es auf dem Server schon 'ne Freigabe gibt, dann wird die neue Service.exe dort abgelegt.
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.679 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Wie Remote Update eine Windows-Service?

  Alt 8. Mär 2016, 10:41
@nahpets ein Service darf Prozesse starten?
Sven Harazim
--
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

AW: Wie Remote Update eine Windows-Service?

  Alt 8. Mär 2016, 10:54
Prinzipell spricht da erstmal nix gegen, ist doch eigentlich auch nur 'ne normale Anwendung.

Der Nutzer, mit dem der Service sich anmeldet, muss halt die entsprechenden Rechte haben.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz