tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
16
ZUGRIFFE
5153
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    eXistenC eXistenC ist offline Mitglied
    Registriert seit
    Apr 2009
    Beiträge
    24
    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
     

  2. #2
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Zitat Zitat von eXistenC Beitrag anzeigen
    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...th-Csharp.html
    Zitat Zitat von eXistenC Beitrag anzeigen
    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? 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
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  3. #3
    eXistenC eXistenC ist offline Mitglied
    Registriert seit
    Apr 2009
    Beiträge
    24
    Zitat Zitat von Nico Graichen Beitrag anzeigen
    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
     

  4. #4
    eXistenC eXistenC ist offline Mitglied
    Registriert seit
    Apr 2009
    Beiträge
    24
    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();
     

  5. #5
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Hi

    Probier doch mal das Property ProcessStartInfo.CreateNoWindow!

    Und wieso sollte Microsoft das installutil umbenennen?
    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.
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  6. #6
    eXistenC eXistenC ist offline Mitglied
    Registriert seit
    Apr 2009
    Beiträge
    24
    Zitat Zitat von Nico Graichen Beitrag anzeigen
    Hi

    Probier doch mal das Property ProcessStartInfo.CreateNoWindow!

    Und wieso sollte Microsoft das installutil umbenennen?
    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
     

  7. #7
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    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
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  8. #8
    eXistenC eXistenC ist offline Mitglied
    Registriert seit
    Apr 2009
    Beiträge
    24
    Zitat Zitat von Nico Graichen Beitrag anzeigen
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    [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
     

  9. #9
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Zitat Zitat von eXistenC Beitrag anzeigen
    OS ist Vista Ultimate 64bit, user ist admin, aber müsste da nicht die Admin Meldung kommen?
    Nicht zwingenderweise

    Ruf die CommandShell mal als Admin auf und für dann installutil aus, um zu schauen, ob es damit geht.
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  10. #10
    eXistenC eXistenC ist offline Mitglied
    Registriert seit
    Apr 2009
    Beiträge
    24
    Zitat Zitat von Nico Graichen Beitrag anzeigen
    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
     

  11. #11
    eXistenC eXistenC ist offline Mitglied
    Registriert seit
    Apr 2009
    Beiträge
    24
    Zitat Zitat von Nico Graichen Beitrag anzeigen
    Nicht zwingenderweise

    Ruf die CommandShell mal als Admin auf und für dann installutil aus, um zu schauen, ob es damit geht.
    und wie bring ich einem service bei das es den User ermahnen muss erst mal admin zu sein (das kenn ich von anderen ies, da poppt dann was und ich muss nur bestätigen oder bei nichtadminkonnto user & pass des admin eingeben)

    NACHTRAG:
    OK, Denkfehler, wenn ich die BAT als ADMIN starte und in der BAT die absoluten Pfade setze, dann geht es reibungslos!
    Danke für den TIP.

    NUn hab ich noch ein Problem. Der Dienst schreibt einfach nicht ins Debug mit Trace.Write... kann er das grundsätzlich nicht oder läuft das in einem anderen Kontext den ich mit SysINternals DebugView ned lesen kann?
    Geändert von eXistenC (25.04.09 um 17:49 Uhr) Grund: tippfehler, ausserdem hab ich das teilproblem gelöst.
     

  12. #12
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Hi,

    Sollte eigentlich funktionieren.
    Hast du in DebugView einen Filter gesetzt, der die Ausgaben vielleicht rausfiltert?
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  13. #13
    eXistenC eXistenC ist offline Mitglied
    Registriert seit
    Apr 2009
    Beiträge
    24
    Zitat Zitat von Nico Graichen Beitrag anzeigen
    Hi,

    Sollte eigentlich funktionieren.
    Hast du in DebugView einen Filter gesetzt, der die Ausgaben vielleicht rausfiltert?
    Ne, keinen Filter. aber habe nun die gleichen Ausgaben in eine Datei gemacht, das geht. Wollte dann mal eine WindowsAnwendung startet (einfach HalloWelt exe mit simplem Form.). Die sieht man dann auch in den Prozessen, aber das Form nicht.

    Keine Ahnung, suche nach nem Tutorial. Aber im internet.google.wald sind mal wieder zu viele Bäume.
     

  14. #14
    Avatar von mutterholzbein
    mutterholzbein mutterholzbein ist offline Mitglied
    Registriert seit
    Feb 2007
    Ort
    Erfurt
    Beiträge
    20
    Hoi,

    man sieht die Form nicht? Wo sieht man denn die Form nicht? in den Prozessen, im Taskmgr, in den Services, (etc.)...
    Bitte konkretisieren. Danke.

    greetz, me
     

  15. #15
    eXistenC eXistenC ist offline Mitglied
    Registriert seit
    Apr 2009
    Beiträge
    24
    Zitat Zitat von mutterholzbein Beitrag anzeigen
    Hoi,

    man sieht die Form nicht? Wo sieht man denn die Form nicht? in den Prozessen, im Taskmgr, in den Services, (etc.)...
    Bitte konkretisieren. Danke.

    greetz, me
    Hallo Mutterholzbein,

    erst mal genialer Nick... Zeugt von Einfallsreichtum.

    Was man sieht:
    Den Dienst, den Prozess des Dienstes und die gestartete WindowsApplication die dann eine Form zeigen soll. Aber nur den Prozess, ...

    Keine Form auf dem Desktop, also besser gesagt er erzeugt keine GUI.

    LG eXi

    Nachtrag:
    Ich mach mal den Code rein, denke das ist nur mal wieder weil ich zu kompliziert denke. lol
    Code :
    1
    2
    3
    4
    5
    6
    7
    
    writeToServiceLog("Testanwendung wird gestartet.");
                    myTest = new Process();
                    myTest.StartInfo.FileName = @"E:\FIleCollector\TestAnwendung.exe";
                    myTest.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
                    myTest.StartInfo.CreateNoWindow = false;                
     
                    myTest.Start();
    Geändert von eXistenC (27.04.09 um 22:15 Uhr) Grund: code beigefügt
     

Ähnliche Themen

  1. Dienst installieren und starten
    Von DrMueller im Forum .NET Application und Service Design
    Antworten: 0
    Letzter Beitrag: 06.03.08, 15:22
  2. #develop, Dienst entwickeln und installieren
    Von D12 im Forum .NET Archiv
    Antworten: 3
    Letzter Beitrag: 26.07.05, 09:40
  3. Windows-Dienst installieren
    Von theindra im Forum Visual Basic 6.0
    Antworten: 3
    Letzter Beitrag: 22.06.04, 18:19
  4. Windows-Dienst installieren
    Von theindra im Forum .NET Archiv
    Antworten: 0
    Letzter Beitrag: 17.06.04, 18:04
  5. XP Pro - Dienst installieren ?
    Von Andreas Späth im Forum Microsoft Windows
    Antworten: 2
    Letzter Beitrag: 12.03.04, 21:50