| 

.NET C# Java Javascript Exception

3
Wir haben ein Tool geschrieben, dass in bestimmten Abständen Befehle ausführen kann. Damit das Möglich ist, haben wir einen Windows-Dienst und eine Windows-Forms Anwendung erzeugt. Beide werden beim Systemstart ausgeführt.

Einer dieser "Funktionen" ist das Installieren/Deinstallieren von Software in einem anderem Benutzerkontext, d.h. bei der Installation wurde ein lokaler Benutzer mit entsprechenden Rechten hinzugefügt. Der Ablauf stellt sich wie folgt da: Dienst oder WinForm erzeugen einen CMD-Prozess mit erhöhten Rechten - diese CMD verbindet sich mit einem Netzwerkshare (wo sich die Anwendungen befinden) - über einen Script (der mit einer DB verbunden ist) wird abgefragt, welche Befehle ausgeführt werden sollen - als Ergbniss wird ein Batch erzeugt und lokal ausgeführt (In diesem Batch stehen dann z.B. die Installationsbefehle wie "msiexec /i xyz.msi /SILENT").

Das Installieren auf einem "frischen" PC stellt keine Probleme dar. Nachdem unser Tool auf allen Rechnern installiert wurde, kann unser Admin zentral gesteuert Software installieren/deinstallieren/aktualisieren ohne an jeden PC hinzugehen und es manuell zu machen.

Problem stellt nun das Tool als solches da: Wie kann ich es per MSI updaten und/oder deinstallieren, also ohne an jeden Rechner zu gehen und manuell einzugreifen? Zur Zeit sieht unser Vorgehen so aus:

1. Taskmanager öffnen – WinForm.exe beenden
2. Dienstverwaltung öffnen – Dienst beenden
3. Systemsteuerung – Software – Tool deinstallieren
4. Benutzerverwaltung öffnen – zusätzlichen Benutzer löschen
5. Neue Version des Tool installieren (am besten per WEMERGE)

Wir haben alles in VB.NET 2008 programmiert. Bei der Installation wird ein benutzerdefiniertes Setup benutzt, welches die Install-Methode überschreibt/erweitert.

Unsere Deinstallations-Routine sieht wie folgt aus:
Public Overrides Sub Uninstall(ByVal savedState As System.Collections.IDictionary)
Dim ToolIni As INIFiles
Dim HKLM As Microsoft.Win32.RegistryKey

' Verbinden zur INI-Datei
ToolIni = New INIFiles(GetTargetDir(Context.Parameters("AssemblyPath")) & "\Tool.ini")
ToolIni.DeleteFile()

' Löschen der batch.cmd (Falls noch vorhanden)
ToolIni.Path = GetTargetDir(Context.Parameters("AssemblyPath")) & "\batch.cmd"
ToolIni.DeleteFile()

' Beenden des Dienstes
Client.LocalUserManagement.StartService(False)

' Deinstallieren der Anwendung
MyBase.Uninstall(savedState)

' Entfernen des UA Service Users
Client.LocalUserManagement.DeleteServiceUser()

HKLM = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True)
HKLM.DeleteValue("WinForm", False)

End Sub
News:
13.04.2011
MyKey0815 1,6k 2 9
3 Antworten
2
Werden über das Tool nur Installationen durchgeführt? Oder wie ist in bestimmten Abständen Befehle ausführen zu verstehen?
Wenn es um Installationsbefehle wie "msiexec /i xyz.msi /SILENT" geht, kommt mir die Vorgehensweise recht ungewöhnlich vor, hat aber vielleicht seine Gründe, die sich mir hier nicht erschließen.
Für Remote-Installationen kenne ich eigentlich diese Vorgehensweise: Deploying MSI via Active Directory.
Falls dir das noch nicht bekannt ist, solltest du es dir ansehen.
Ist deine Vorgehensweise dennoch erforderlich, kannst du auch über das Active Directory deinen eigenen Installer updaten.
13.04.2011
Jürgen Luhr 7,1k 2 9
Danke Jürgen für den Hinweis auf den Link. Bei der Verwendung von MSI-Paketen stellt das alles auch kein Problem dar. Aber wie sieht es mit den vielen Anwendungen aus, die KEIN MSI sind? Die gehen leider nicht.

Aber du hast Recht: Wenn ein AD vorhanden ist, dann könnte man über die Variante nachdenken. Ist zumindestens ein Denkanstoß
MyKey0815 13.04.2011
1
Kannst du die "anderen" Anwendungen nicht in ein MSI verpacken?
Wenn nicht, bliebe noch der Weg deinen Installer über das AD zu ersetzen.
Jürgen Luhr 13.04.2011
1
Was würde gegen eine Preloader sprechen?
Du staretst Deine App nicht direkt, sondern erst einen Preloader der prüft ob eine neue Version der App existiert, diese gegebenenfalls runterlädt und die anschliessend startet.
So machen es auch die ganzen MMOs
13.04.2011
Jaksa 4,0k 1 8
Geht das auch mit Windows-Diensten?

Wenn der Preloader getauscht werden muss, hab ich ja wieder das selbe problem, oder?

Aber dennoch auch ein interessanter Ansatz.
MyKey0815 13.04.2011
Windows Dienste: weiss ich nicht.
Alternative wäre ein Post-Installer. Sprich Deine Anwendung prüft ob eine neue Version existiert, lädt diese im Hintergrund herunter und nach dem beenden des Dienstes wird dann ein Script / Programm aufgerufen welches Deine Anwendung löscht und die heruntergeladene umbennent.
Jaksa 13.04.2011
0
Meine Lösung ist jetzt folgende:

Wenn die Deinstallation gestartet wurde, beende ich die Prozesse des Dienstes und der WinForm. Dann wird die Installation erfolgreich durchgeführt und alle anderen Aufräumarbeiten bereinigen die Überreste.

...
' Beenden des Clients
For Each Process In System.Diagnostics.Process.GetProcessesByName("WinForm")
Process.Kill()
Next

' Beenden des Dienstes
Client.LocalUserManagement.StartService(False)
For Each Process In System.Diagnostics.Process.GetProcessesByName("Tool")
Process.Kill()
Next

...
15.04.2011
MyKey0815 1,6k 2 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH