jak podmienić usługi windows (aktualizacja do najnowszej wersji) przez FTP

0

Witam serdecznie. Postanowiłem poćwiczyć pisanie WindowsService. Stworzyłem dwie usługi:

  1. MyUpdateService
  2. MyAppService

screenshot-20200407125318.png

MyUpdateService ma dostęp do serwera FTP, gdzie trzymam najnowszą wersję usługi MyAppService. Zamierzam w MyUpdateService co interwał czasu porównywać wersję usługi MyAppService z tą na serwerze FTP. i teraz pytanie czy to najlepszy sposób na "podmianę usług"?:

  1. MyUpdateService pobiera nową wersję oprogramowania i zapisuje ją do tymczasowego folderu. Jeżeli powiodło się:
  2. MyUpdateService wyłącza i odinstalowuje usługę MyAppService. Jeżeli powiodło się:
  3. MyUpdateService usuwa pliki starej wersji, zastępuje je nowymi oraz instaluje nową usługę. Jeżeli powiodło się:
  4. MyUpdateService uruchamia zaktualizowaną usługę MyAppService

Drugie pytanie na które nie znalazłem satysfakcjonującej odpowiedzi w internecie:
Czy istnieją kreatory instalacji usług coś typu InstallWizard które zainstalują usługę MyUpdateService i uruchomią ją?

3

Nie musisz odinstalowywać usługi. Wystarczy wyłączyć, podmienić pliki i uruchomić ;-)

0

@AdamWox: Z tą zależnością, że nazwa usługi i pliki logów muszą pozostać takie same?

2

Tak. Nazwa .exe, bo do niego masz odnośnik skąd ma usługa się uruchomić. Z logami nie wiem co masz na myśli

0

Tak więc jeżeli chodzi o aktualizację wszystko pójdzie sprawnie. natomiast jak się ma sprawa instalatora usługi? jedną z opcji jest napisanie go samemu, ale nie ma kreatorów instalacji usług?

2

Ja używam InnoSetup. W kodzie instalatora możesz sobie dopisać swoje "skrypty"

[Run]
Filename: "sc"; Parameters: "create MyService start= auto DisplayName= MyService binPath= ""{app}\MyService.exe"""; Flags: runhidden
1

Co do intalatora to możesz zrobić to prostą komendą: https://docs.microsoft.com/pl-pl/dotnet/framework/tools/installutil-exe-installer-tool

0

Instalowanie usług z wiersza poleceń ogarniam, chodziło mi tylko o "automatyzację". InnoSetup w takim razie będzie ekstra. Dziękuje panowie : )
Jak skończę to pisać podeślę kod dla innych :)

0

Przepraszam, że odnawiam stary wątek, ale napotkałem trudność podczas deinstalacji serwisu:

screenshot-20200412163948.png

  1. Instalator instaluje Service1 i uruchamia go (pliki dla Service1)
  2. Deinstalator odinstalowuje Service1 i usuwa pliki.

Problem leży w tym, że Service1 zajmuje się pobieraniem najnowszej wersji Service2, liczba plików może ulegać zmianie.
W jaki sposób zaprojektować Deinstalator, aby najpierw usunął wszystkie pliki Service2, a następnie odinstalował Service1?

  • Jedyne co wymyśliłem, to dostarczenie w pliku instalacyjnym exeka który usunie service2 i uruchomienie go przed deinstalacją. Ale czy do dobre podejście?
2

Jeśli korzystasz z InnoSetup to tutaj masz naprowadzenie How can i get Inno setup uninstaller script to remove a service

0

To udało mi się zrobić, jednak chodzi mi o usunięcie plików usługi tzn:
Podczas instalacji tworzy się folder MyProgram z plikami. Podczas działania są dostarczane nowe pliki do katalogu.
Deinstalacja owszem, usuwa usługi, ale pliki dodane po instalacji nie zostają usunięte i zostają śmieciami w systemie, a to jest niepoprawne. i właśnie tutaj myślę o dostarczaniu pliku wykonywalnego do usuwania plików usługi nr 2 i uruchamianiu go przed procedurą deinstalacji

screenshot-20200412170937.png

Aktualizacja będzie nadpisywała plik UninstallService2.exe aby mieć pewność, że wszystkie pliki Service2 będą usunięte. To jest dobre podejście?

1

Aaa nie zrozumiałem do końca. Aby usunąć dodatkowe pliki i/lub foldery to używa się [UninstallDelete]
How to delete folder during uninstallation process?

0

Ta opcja przydatna, jednak deinstalator nie będzie znał listy plików do usunięcia. Pomyślałem o usunięciu całego folderu, jednak po przeczytaniu dokumentacji odwiodło mnie od tego pomysłu to zdanie:
https://jrsoftware.org/ishelp/ [UninstallDelete] section

NOTE: Don't be tempted to use a wildcard here to delete all files in the {app} directory. Doing this is strongly recommend against for two reasons. First, users usually don't appreciate having their data files they put in the application directory deleted without warning (they might only be uninstalling it because they want to move it to a different drive, for example). It's better to leave it up to the end users to manually remove them if they want. Also, if the user happened to install the program in the wrong directory by mistake (for example, C:\WINDOWS) and then went to uninstall it there could be disastrous consequences. So again, DON'T DO THIS!

Dobrze myślę czy źle? Wybacz za tą troskliwość ale pierwszy raz w życiu chcę zrobić coś rzetelnie i dobrze :)

EDIT:
Chyba, że Service2 będzie umieszczony w katalogu np {win}/DirService2, dopiero na to wpadłem

2

No to mam kilka pytań:

  1. Czy użytkownik ma opcję zainstalowania aplikacji gdzie indziej (Service1)?
  2. Czy użytkownik ma wpływ na ścieżkę instalacyjną Service2?
  3. Czy użytkownik do czegokolwiek potrzebuje zachować jakieś ustawienia, dane?
  4. Czy Service2 może być instalowane w innym folderze niż Service1?

Jeśli twoje odpowiedzi są:

  1. Nie
  2. Nie
  3. Nie
  4. Tak

To możesz śmiało usuwać co chcesz. Jeśli o punkcie 4. to ty decydujesz gdzie aplikacja się instaluje to banalnym rozwiązaniem jest zrobić subfolder, w którym usuniesz najpierw Service2, a później leci najnormalniejszy uninstall "głównej" aplikacji (Service1) i nikomu żadna krzywda się nie stanie ;-)

0
[UninstallDelete]
Type: filesandordirs; Name: "{app}\GSAddedServices"

Uninstaller działa mi bez problemu usuwając katalog główny, tylko że to nie powinno działać. teraz już się nadwyraz czepiam, ale chciałbym to zrozumieć:

Skoro [UninstallDelete] występuje na ostatnim miejscu w kolejce procedury deinstalacji, to nie powinno to wyglądać w tej kolejności?

  1. Usuwanie plików które zostały zainstalowane:
  2. Próba usunięcia folderu {app} zakończona niepowodzeniem, ponieważ istnieje niepusty folder GSAddedServices
  3. Wykonanie sekcji [UninstallDelete] ?

W tym momencie mój uninstaller zachowuje się tak jak chcę, tylko dlaczego wygląda jakby na samym końcu zostało wywołane
Type: dirifempty; Name: "{app}"

EDIT:
Żeby nie było, problem deinstalacji jest rozwiązany. Wszystko działa. Teraz tylko kwestia zrozumienia działania :)

2

Wydaje mi się, że dochodzi jeszcze do tego kolejność wykonywania danych sekcji w InnoSetup - Installation Order. Aż tak daleko z tym nie doszedłem. Nie miałem takiej potrzeby.

0

Odpowiedź znalazłem w logach:

[1844,619] Starting the uninstallation process.
[1844,634] Running Exec filename: C:\WINDOWS\system32\sc.exe
[1844,634] Running Exec parameters: stop GSPrinterSvc
[1844,712] Process exit code: 0
[1844,712] Running Exec filename: C:\WINDOWS\system32\sc.exe
[1844,712] Running Exec parameters: delete GSPrinterSvc
[1844,775] Process exit code: 0
[1844,775] Running Exec filename: C:\WINDOWS\system32\sc.exe
[1844,775] Running Exec parameters: stop GSPrinterDbSvc
[1844,853] Process exit code: 1060
[1844,853] Running Exec filename: C:\WINDOWS\system32\sc.exe
[1844,853] Running Exec parameters: delete GSPrinterDbSvc
[1844,915] Process exit code: 1060
[1844,962] Deleting file: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\My Program\Dezinstalacja aplikacji My Program.lnk
[1844,962] Deleting directory: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\My Program
[1844,962] Deleting file: C:\Program Files (x86)\My Program\PrinterInformationUpdater.InstallLog
[1844,962] Deleting file: C:\Program Files (x86)\My Program\PrinterInformationUpdater.exe.config
[1844,962] Deleting file: C:\Program Files (x86)\My Program\PrinterInformationUpdater.exe
[1844,978] Deleting file: C:\Program Files (x86)\My Program\InstallUtil.InstallLog
[1844,978] Deleting directory: C:\Program Files (x86)\My Program
[1844,978] Failed to delete directory (145). Will retry later.
[1844,978] Deleting Uninstall data files.
[1845,009] Deleting directory: C:\Program Files (x86)\My Program
[1845,025] Uninstallation process succeeded.
[1845,025] Removed all? Yes
[1845,040] Need to restart Windows? No
[1845,619] Message box (OK):
Aplikacja My Program została usunięta z komputera.
[1804,769] User chose OK.
[1804,785] *** Uninstall exit code: 0

W tym miejscu po prostu przekłada usuwanie folderu na sam koniec po niepowodzeniu:

[1844,978] Failed to delete directory (145). Will retry later.
[1844,978] Deleting Uninstall data files.
[1845,009] Deleting directory: C:\Program Files (x86)\My Program
[1845,025] Uninstallation process succeeded.

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