Windows Dienst aus C# Projekt installieren.

eXistenC

Mitglied
Hallo Leute,

ich mach eine kleine Anwendung um einen Windows Dienst zu konfigurieren, starten, beenden und vor allem eine XML (Config) zu ändern.

Nun habe ich noch folgende Anforderung, das meine Anwendung den Dienst auch installieren sollte wenn er fehnlt. Das Fehlen des Dienstes kann ich mit ner Exception bei Status-Abfrage herausfinden. Was aber ujnsauber ist in meinem Augen.

Kann ich
A: direkt prüfen ob ein Dienst mit einem bestimmten Namen existiert
und
B: diesen Dienst Installieren ohne das ich über Prozess den Serviceinstaller.exe aufrufe oder anders rumtrickse?

LG eXi
 

Nico Graichen

Erfahrenes Mitglied
Hallo Leute,

ich mach eine kleine Anwendung um einen Windows Dienst zu konfigurieren, starten, beenden und vor allem eine XML (Config) zu ändern.

Nun habe ich noch folgende Anforderung, das meine Anwendung den Dienst auch installieren sollte wenn er fehnlt. Das Fehlen des Dienstes kann ich mit ner Exception bei Status-Abfrage herausfinden. Was aber ujnsauber ist in meinem Augen.

Kann ich
A: direkt prüfen ob ein Dienst mit einem bestimmten Namen existiert
Da hilft dir WMI weiter. Hier mal ein Beispiel:
http://www.geekpedia.com/tutorial225_Listing-Services-with-Csharp.html
und
B: diesen Dienst Installieren ohne das ich über Prozess den Serviceinstaller.exe aufrufe oder anders rumtrickse?

LG eXi
Wieso wäre der Aufruf des serviceutil (ich nehm mal an das meinst du) denn rumgetrickst? :confused: Der ist doch genau dafür gedacht.
Alternativ kannst du die Daten auch selbst in die Registry schreiben. Kannst ja mal schauen, was die elegantere und saubere Variante ist ;)
 

eXistenC

Mitglied
Wieso wäre der Aufruf des serviceutil (ich nehm mal an das meinst du) denn rumgetrickst? Der ist doch genau dafür gedacht.
Alternativ kannst du die Daten auch selbst in die Registry schreiben. Kannst ja mal schauen, was die elegantere und saubere Variante is

Hallo Nico,

wenn ich das mit der "installutil.exe" mache dann wohl entweder über eine batch Datei die gestartet wird oder über einen Process wo ich diese dann starte.

Aber ich muss den Pfad zur installutil übergeben, der kann sich ändern, bzw. bei späteren Frameworks könnte sogar die EXE einen anderen Namen bekommen, oder?

Also hatte ich gehofft ich finde was wie ServiceController.Start() nur halt mit .install(FilePath) oder .uninstall(FilePath).

Klar kann ich das mit Process über installutil machen, .... So läuft es ja jetzt auch schon. Wollte es nur verbessern.

LG eXi
 

eXistenC

Mitglied
Machs nun erst mal wieder über Process. Allerdings baut er trotz LogToConsole=false & UseShellExecute = false eine console auf was unschön aussieht. Kann man die noch anders unterdrücken oder hab ich irgendeinen Fehler drin, den ich übersehe?

Process instProcess = new Process();
instProcess.StartInfo.FileName = myServiceInstaller;
instProcess.StartInfo.Arguments = "/LogToConsole=false " + myServiceApplication;
instProcess.StartInfo.UseShellExecute = false;
instProcess.Start();
instProcess.WaitForExit();
 

Nico Graichen

Erfahrenes Mitglied
Hi

Probier doch mal das Property ProcessStartInfo.CreateNoWindow!

Und wieso sollte Microsoft das installutil umbenennen? :confused:
Das wäre eine Schnittstellenänderung würde eine neue Version bedeuten.
.NET ist im Kern aber weiterhin in der Version 2.0. 3.0 und 3.5 sind nur Erweiterungen.
 

eXistenC

Mitglied
Hi

Probier doch mal das Property ProcessStartInfo.CreateNoWindow!

Und wieso sollte Microsoft das installutil umbenennen? :confused:
Das wäre eine Schnittstellenänderung würde eine neue Version bedeuten.
.NET ist im Kern aber weiterhin in der Version 2.0. 3.0 und 3.5 sind nur Erweiterungen.


Property ProcessStartInfo.CreateNoWindow! war mir schlicht entfallen.

Wies nicht ob ich sicher sein kann das InstallUtil immer in diesen Ordnern ist
C:\Windows\Microsoft.NET\Framework\v2.0.50727
C:\Windows\Microsoft.NET\Framework64\v2.0.50727
Aber ich werd das einfach beim Setup mit übergeben dann bin ich auf der sicheren Seite. Danke für die Anregungen.

LG eXi
 

Nico Graichen

Erfahrenes Mitglied
Ja liegt immer da. Es sei denn du nutzt .NET 1.0 oder 1.1.

Zur Sicherheit kannst du ja die Systemvariable für das Windows-Verzeichnis nutzen. Das Framework liegt aber immer da drin
 

eXistenC

Mitglied
Ja liegt immer da. Es sei denn du nutzt .NET 1.0 oder 1.1.

Zur Sicherheit kannst du ja die Systemvariable für das Windows-Verzeichnis nutzen. Das Framework liegt aber immer da drin

OK, hatte gedacht es gibt einen anderen Weg. Also nehmen wir den.

Aber ich bekomme den Dienst nicht ans Laufen.

Meldung:
Während der Installationsphase ist eine Ausnahme aufgetreten.
System.Security.SecurityException: Die Quelle wurde nicht gefunden, aber einige oder alle Ereignisprotokolle konnten nicht durchsucht werden. Protokolle, auf die kein Zugriff möglich war: Security.

Ich nehme mal an das verursacht der ServiceInstaller:
Code:
[RunInstaller(true)]
public class ProjectInstaller : Installer
{
    public ProjectInstaller()
     {     
            ServiceProcessInstaller myServiceProcessInstaller = new ServiceProcessInstaller();
            myServiceProcessInstaller.Account = ServiceAccount.LocalService;

            ServiceInstaller myServiceInstaller = new ServiceInstaller();
            myServiceInstaller.DisplayName = "TestServer";
            myServiceInstaller.ServiceName = "TestServer";
            myServiceInstaller.StartType = ServiceStartMode.Automatic;
            Installers.AddRange(new Installer[] { myServiceProcessInstaller, myServiceInstaller });           
            }
        }

irgendeine Idee wie man das abstellen kann?
OS ist Vista Ultimate 64bit, user ist admin, aber müsste da nicht die Admin Meldung kommen?

myServiceProcessInstaller.Account hab ich alles, sogar den user getestet,.... nix geht, muss ich das unter vista anders lösen?

LG eXi
 

eXistenC

Mitglied
Nicht zwingenderweise

Ruf die CommandShell mal als Admin auf und für dann installutil aus, um zu schauen, ob es damit geht.

Hi Nico,

da hätt ich auch mal drauf kommen müssen, lol.

1. nun ist der ohne fehler gelaufen.
2. dienst findet sich nun in den diensten (angehalten)
3. dienst will aber nicht starten:
meldung:
Der Dienst TestServer auf "lokaler Computer" konnte nicht gestartet werden.
Fehler 5: Zugriff verweigert. *grummel*

das hat man nun davon, steckt 3.5t € in einen Rechner, gibt dem tonnenweise Strom und dann verweigert der einem so was *lächel* auspeitschen sollte man den.

Ok, Vista ist sicherer als XP .. Das habe ich nun gelernt. Aber wie macht man so was damit das installierbar ist wenn man den ZIelrechner nicht zwingend kennt?

Danke, eXi
 

Neue Beiträge