Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Programmupdate im Dienst - So möglich? (https://www.delphipraxis.net/211490-programmupdate-im-dienst-so-moeglich.html)

QuickAndDirty 23. Sep 2022 10:35

AW: Programmupdate im Dienst - So möglich?
 
Update.exe kann eine Laufende .exe umbennen! Das geht auch von hand im explorer... ich war auch erschrocken als ich das getestet hab, aber es geht.
  1. Update.Exe benennt meindienst.exe im laufenden Betrieb um in Meindienst_kannweg_2022_09_23_12_00.exe
  2. Update.Exe führt einen download der neuen Meindienst.exe durch und speichert sie anstelle der alten meindienst.exe
  3. Update.Exe initiert entweder einen Neustart des Dienstes oder es trägt einen Neustart des dienstes in den Taskscheduler von Windows ein oder man wartet bis der Dienst aus anderen Gründen neustartet.
  4. meindienst.exe löscht beim start Meindienst_kannweg_2022_09_23_12_00.exe

MyRealName 23. Sep 2022 11:27

AW: Programmupdate im Dienst - So möglich?
 
Windows hängt das Handle der offenen Datei einfach beim Umbennen um

QuickAndDirty 23. Sep 2022 11:41

AW: Programmupdate im Dienst - So möglich?
 
Zitat:

Zitat von MyRealName (Beitrag 1512329)
Windows hängt das Handle der offenen Datei einfach beim Umbennen um

ist auf jedefall, cool , denn es erlaubt Software Updates mit super wenig downtime.

himitsu 23. Sep 2022 13:31

AW: Programmupdate im Dienst - So möglich?
 
Es gibt garkeine offenen FileHandle auf die EXE.
Der Programmcode wird via MMF in den Speicher gemappt. (ein FileHandle gibt es nur kurz beim Programmstart)

Das Mapping auf den Dateiihnalt (Festplatte) arbeitet anders und daher wird das Umbenennen nicht behindert.
Nur das Löschen/Ändern geht so halt nicht, aber der Adressaufkleber (der Dateiname) kann geändert werden. (MMF hängt halt nicht am Pfad/Namen, sondern am Inhalt)

Bernhard Geyer 23. Sep 2022 14:05

AW: Programmupdate im Dienst - So möglich?
 
Zitat:

Zitat von QuickAndDirty (Beitrag 1512334)
Zitat:

Zitat von MyRealName (Beitrag 1512329)
Windows hängt das Handle der offenen Datei einfach beim Umbennen um

ist auf jedefall, cool , denn es erlaubt Software Updates mit super wenig downtime.

Das funktioniert aber immer nur Semi-Stabil.

Den Trick versuchte ich immer wieder in den letzten "Jahrzehnten" zu nutzen, um Updates am Server trotz offener Anwendung auszutauschen.
Im einem Jahr ging es, im nächsten nicht mehr.
Ok. An einem Netzwerkshare ist es komplizierter da noch weitere Faktoren rein spielen könnten

QuickAndDirty 23. Sep 2022 16:13

AW: Programmupdate im Dienst - So möglich?
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1512346)
Zitat:

Zitat von QuickAndDirty (Beitrag 1512334)
Zitat:

Zitat von MyRealName (Beitrag 1512329)
Windows hängt das Handle der offenen Datei einfach beim Umbennen um

ist auf jedefall, cool , denn es erlaubt Software Updates mit super wenig downtime.

Das funktioniert aber immer nur Semi-Stabil.

Den Trick versuchte ich immer wieder in den letzten "Jahrzehnten" zu nutzen, um Updates am Server trotz offener Anwendung auszutauschen.
Im einem Jahr ging es, im nächsten nicht mehr.
Ok. An einem Netzwerkshare ist es komplizierter da noch weitere Faktoren rein spielen könnten

Naja Updates sind bei mir immer lokal und das Update wird von einem Dienst durchgeführt. Der Dienst ist immer aus. Wird nur für das Update gestartet und existiert wirklich nur um die Elevevated Rights aus der installation zu konservieren, so dass Updates immer mit Elevated Right durchegführt werden können.
Zudem setzte ich den SecurityDiscriptor(ACL) des Dienstes , bei der installation(ServiceAfterInstall) herunter, damit er von Anwendungen mit Userrechten gestartet werden kann.
Ich weiß nicht viel darüber, aber ich habe es mir (ein bisschen) von Chrome und (sehr viel)von Firefox abgeschaut.

Nutze im Moment diese ACLs für den Update Service...oder Elevation Service...
Delphi-Quellcode:
{//Alte ACL (SDDL )
  Permission := 'D:' +
  '(A;;CCLCSWRPWPDTLOCRRC;;;SY)' +         // default permissions for local system
  '(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)' + // default permissions for administrators
  '(A;;CCLCSWLOCRRC;;;AU)' +               // default permissions for authenticated users
  '(A;;CCLCSWRPWPDTLOCRRC;;;PU)' +         // default permissions for power users
  '(A;;CCDCLCSWRPWPDTLOCRSDRC;;;BU)'+      // Built IN Users
  '(A;;RP;;;IU)';                         // added permission: start service for interactive users
}
  Permission := 'D:' +
  '(A;;CCLCSWRPWPDTLOCRRC;;;SY)' +         // default permissions for local system
  '(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)' + // default permissions for built-in administrators
  '(A;;CCLCSWRPLOCRRC;;;IU)'+              // permissions for interactively logged-on user  von MozillaMaintainance und ChromeElevation
  '(A;;CCLCSWRPLOCRRC;;;SU)'+              // permissions for service logon user von MozillaMaintainance und ChromeElevation
  '(A;;CCDCLCSWRPWPDTLOCRSDRC;;;BU)'+      // permissions for built-in users
  '(A;;CCLCSWRPLOCRRC;;;AU)' +             // default permissions for authenticated users
  '(A;;CCLCSWRPWPDTLOCRRCRP;;;PU)';       // default permissions for power users
Wenn die mal nicht mehr ausreichen passe ich die halt an.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:46 Uhr.
Seite 2 von 2     12   

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