Zum Inhalt springen

Service in C# erstellt, Problem/Frage


Empfohlene Beiträge

Geschrieben

Hi.

Ich bin dabei einen Service mit C# zu programmieren.

Den Servide als solchen habe ich fertig. Habe ihn auch schon testweise installiert und deinstalliert.

Allerdings tut der Service momentan einfach nichts.

Folgenden Code habe ish bisher:


using System.ComponentModel;

using System.IO;

using System.Windows.Forms;


namespace dienstname

{


    public class service : ServiceBase

    {

        static void Main()

        {

            service.Run(new service());

            System.IO.File.Delete("c:\\text.txt");


        }


        protected override void OnStart(string[] args)

        {

            base.OnStart(args);

            System.IO.File.Delete("c:\\1.txt");

            /*MessageBox.Show("service gestartet");*/

        }

        protected override void OnContinue()

        {

            base.OnContinue();

        }

        protected override void OnStop()

        {

            /*MessageBox.Show("stoppe service...");*/

            System.IO.File.Delete("c:\\2.txt");

            base.OnStop();

            System.IO.File.Delete("c:\\3.txt");

            /*MessageBox.Show("service gestoppt");*/

        }


    }


    [RunInstaller(true)]

    public class Installation : Installer

    {

        private ServiceInstaller service;

        private ServiceProcessInstaller process;

        public Installation()

        {

            service = new ServiceInstaller();

            process = new ServiceProcessInstaller();


            service.ServiceName = "dienstname;

            service.DisplayName = "dienstname Service";

            service.Description = "beschreibung";


            process.Account = ServiceAccount.NetworkService;


            Installers.Add(process);

            Installers.Add(service);

        }

    }

}

Wie ihr sehen könnt, habe ich ein wenig experimentiert.

Ich habe schon vorher auf c:\ ein paar leere text-dokumente angelegt. Diese soll der dienst beim starten bzw. auch beim beenden löschen.

Allerdings passiert dies nicht.

So wie ich das verstanden habe, wird, nachdem der dienst gestartet wurde, die main() gestartet. Aber wieso wird dann die test.txt auf c:\ nicht gelöscht?

Habe es zu testzwecken auch schon mit ner messagebox probiert (siehe auskommentierten code).

Hab ich nen Brett vorm Kopf oder was ist hier das Problem? ^^"

LG XspYroX

Geschrieben

Hey,

dein Service ruft die Main Methode nicht auf, grundsätzlich geht es mit OnStart() los. Hat network service schreibrechte auf C? Falls nicht fliegt eine exception und dein Service tut nichts. Bau mal exception Handling für die Delete Operation ein und schreib es über einen Trace ioder meinetwegen auf StreamReader in eine Datei (try/catch usw).

Geschrieben

Konnte es doch jetzt schon testen:

Habe die Main() aus der onStart augerufen: Kein effekt.

Habe das Konto von Netzwerkkonto auf systemkonto geändert: nichts.

Habe das konto auf einen real existierenden user geändert (admin-rechte): nichts.

Installiert wird der service richtig. Nur wenn ich ihn starte, passiert eben nichts, außer dass er als "läuft" angezeigt wird :(

Weitere Vorschläge?

Geschrieben

Hast Du mal ein einfaches Logging eingebaut? Ganz banal Timestamp und aktuellen Methodennamen in eine Textdatei schreiben um zu gucken, wie weit er überhaupt kommt?

Geschrieben (bearbeitet)
Hast Du mal ein einfaches Logging eingebaut? Ganz banal Timestamp und aktuellen Methodennamen in eine Textdatei schreiben um zu gucken, wie weit er überhaupt kommt?

Habs getestet.

Meine main() sieht jetzt so aus:

static void Main()

{

service.Run(new service());

StreamWriter myFile = new StreamWriter("C:\\test.txt");

myFile.Write("test-zeile");

myFile.Close();

}

ergebnis: nichts. Kein inhalt in der datei, wenn diese schon vorhanden war; keine datei, wenn diese vorher nicht existiert hat.

edit:

Wenn ich den selben code

            System.IO.StreamWriter myFile = new System.IO.StreamWriter("C:\\test.txt");

            myFile.Write("wurde installiert");

            myFile.Close();

in den installer-bereich kopiere, passiert auch nichts.

Bearbeitet von XspYroX
Geschrieben (bearbeitet)
Hallo XspYroX

auf folgendes bist du noch überhaupt nicht eingegangen, schon überprüft ??

Gruß Hans-Jörg

Oh, sorry :)

Ich habe die Schreibrechte von network service nicht geprüft, da ich eben auch den lokalen admin und den systemadmin ausprobiert habe. es hat nie funktioniert und ich denke mal, dass zumindestens der Systemadmin rechte auf C haben sollte, oder?

Ich bin heute nicht an dem Rechner. an dem ich programmiere. Aber ich werde es morgen früh direkt einmal testen (ich nehm dann einfach D und setz vorher die rechte auf "allow-all") und dann Bescheid geben :)

LG XspYroX

edit: Kann man eigentlich irgendwie einstellen, dass der dienst ne windows-fehlermeldung ausgibt, wenn ein fehler auftritt?

Kommt mir so komisch vor, dass der dienst keinerlei fehler anzeigt, sondern einfach nur stumm "läuft".

Gibts da nen schalter, mit dem man, ohne manuell in eine datei schreiben zu lassen, fehler ausgeben oder anzeigen lassen kann?

Bearbeitet von XspYroX
Geschrieben (bearbeitet)

Hey XspYroX!

IdR schreibt ein Service in die Ereignisanzeige, besonders unhandled Exceptions (die du natürlich vermeiden solltest ;)). Es gibt da z.B. wenn du das richtig aufziehen willst noch die Enterprise Library, die erweiterte Methoden für das Logging bietet.

(Hier gibts nen Webcast dazu, zwar nicht mehr taufrisch, aber erklärt ganz gut, was man damit machen kann und was es abdeckt.)

Aber da so ein Dienst an sich ungesehen im Hintergrund arbeiten soll, wäre so eine 5 Zeilige Exception-MessageBox eher nachteilig. Du kannst, wenn du den Dienst in einer MSI shippst auch relativ einfach nen Installerpaket dafür erstellen, sowas ist z.B. hier recht gut beschrieben.

Das sollte so als grobes Infomaterial für den Start reichen, denke ich.

Gruß, Ziege

Bearbeitet von Goulasz
Geschrieben (bearbeitet)

Ok...

Ich bekomme in de Ereignisanzeige:

Frameworkversion: v4.0.30319

Beschreibung: Der Prozess wurde aufgrund einer unbehandelten Ausnahme beendet.

Ausnahmeinformationen: System.UnauthorizedAccessException

Stapel:

   bei System.IO.__Error.WinIOError(Int32, System.String)

   bei System.IO.FileStream.Init(System.String, System.IO.FileMode, System.IO.FileAccess, Int32, Boolean, System.IO.FileShare, Int32, System.IO.FileOptions, SECURITY_ATTRIBUTES, System.String, Boolean, Boolean)

   bei System.IO.FileStream..ctor(System.String, System.IO.FileMode, System.IO.FileAccess, System.IO.FileShare, Int32, System.IO.FileOptions)

   bei System.IO.StreamWriter.CreateFile(System.String, Boolean)

   bei System.IO.StreamWriter..ctor(System.String, Boolean, System.Text.Encoding, Int32)

   bei System.IO.StreamWriter..ctor(System.String)

   bei alfaSecuSvr.service.Main()

bzw. "Pfad des fehlerhaften Moduls: C:\Windows\syswow64\KERNELBASE.dll" und
P2: 1.0.0.0

P3: 50eae2c2

P4: mscorlib

P5: 4.0.0.0

P6: 4e181ae3

P7: 3fd1

P8: 13c

P9: System.UnauthorizedAccess

P10: 
Aber ich bin Admin o_o Bei der installations-routine im code habe ich:
process.Account = ServiceAccount.LocalSystem;

Zumindestens weiß ich jetzt, dass es nen Fehler gibt und nicht, dass der code einfach nicht angetastet wird :/

Nächte Frage ist natürlich: Wie bekomme ich den Fehler weg?

Ich hab auch testweise versucht auf D: zu schreiben, selbes Problem.

Rechte sind auf D "jeder:full" :/

edit: Habe jetzt testweise "SystemSounds.Beep.Play();" anstelle der write-sachen eingetragen.

Es kommt kein beep, aber auch kein fehler in der ereignisanzeige.

....

Bearbeitet von XspYroX
Geschrieben

Habe jetzt:

            process.Account = ServiceAccount.User;

            process.Username = "admin";

            process.Password = "password";
Auf das Laufwerk und die datei hat jeder und adminostratoren vollzugriff. Habe jetzt in der main und onStart stehen:
System.IO.File.Delete("D:\\test.txt");
Die datei d:\test.txt wird aber absolut nicht gelöscht. Irgendwas stimmt da doch nicht, oder? Ich installiere den dienst ganz normal per "InstallUtil.exe programmSvr.exe". Im Eventlog kommen keine Fehlermeldungen mehr, daher kann ich auch nicht sagen, woran es dieses mal liegt :/ In der onStart steht jetzt noch:
            System.Diagnostics.Trace.AutoFlush = true;

            System.Diagnostics.Trace.Indent();

Hab ich etwas vergessen einzufügren, weshalb im eventlog nichts mehr angezeigt wird?

Geschrieben

Eben noch C:\, jetzt schon D:\. Was willst du denn überhaupt machen? Lass den bekloppten Service doch einfach unter deinem Konto laufen (Anmeldedaten manuell unter "Services" ändern) und kopier irgendwas von X nach "Eigene Dateien". Da wirst du schon sehen, ob er deinen Code ausführt...

Geschrieben

Erstmal möchte ich, dass der Service genau das macht, was ich ihm sage ;)

Zwischen C: und D: habe ich gewechselt, um die Berechtigungsfehler ausschließen zu können.

Meine eigenen Anmeldenamen hab ich auch schon als ServiceAccount.User eingegeben. Hat auch nichts gebracht.

Ich habe das dateilöschen als "test-aktion" genommen, da es aus meiner Sicht eigentlich am wenigsten Fehler mit sich bringen sollte.

Ich kann aber morgen auch nochmal gerne das Kopieren einer Datei versuchen.

Mein Problem ist ja aber:

Selbst, wenn das Dateikopieren funktionieren sollte... Wieso geht dann das löschen oder schreiben in dateien nicht? ;)

LG XspYroX

Geschrieben

Hallo

will dir ja deinen Glauben nicht nehmen, aber wenn du eine Datei nicht löschen kannst, wirst auch in dieses Verzeichnis nicht schreiben können und somit auch keine Datei hin und her kopieren können.

Gruß Hans-Jörg

Geschrieben

Naja... das ist ja das, was ich auch glaube.

Ich werde morgen einmal meinen kompletten Code posten, von anfang bis Ende.

Vielleicht ist ja etwas mit meinen Instalaltionsroutinen nicht in Ordnung oder irgendeine Art initialization fehlt :/

Geschrieben

So. Hier dann einmal der komplette Code:



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ServiceProcess;

using System.Timers;

using System.Configuration.Install;

using System.ServiceModel;

using System.ComponentModel;

using System.IO;

using System.Windows.Forms;

using System.Diagnostics;


namespace alfaSecuSvr

{


    public class service : ServiceBase

    {

        static void Main()

        {

            service.Run(new service());


            System.IO.File.Delete("D:\\test.txt");

        }


        protected override void OnStart(string[] args)

        {

            base.OnStart(args);

            System.Diagnostics.Trace.AutoFlush = true;

            System.Diagnostics.Trace.Indent();

            System.IO.File.Delete("D:\\test.txt");


        }

        protected override void OnContinue()

        {

            base.OnContinue();

        }

        protected override void OnStop()

        {

            base.OnStop();

            System.IO.File.Delete("D:\\3.txt");

            MessageBox.Show("service gestoppt");

        }

    }


    [RunInstaller(true)]

    public class Installation : Installer

    {

        private ServiceInstaller service;

        private ServiceProcessInstaller process;

        public Installation()

        {

            service = new ServiceInstaller();

            process = new ServiceProcessInstaller();


            service.ServiceName = "alfaSecuSvr";

            service.DisplayName = "alfaSecu Service";

            service.Description = "alfaSecu als Dienst. Bei Fragen beim Programmierer (mail@mail.de) melden =)";


            process.Account = ServiceAccount.LocalSystem;



            Installers.Add(process);

            Installers.Add(service);

        }

    }




}





Ihr könnt den Code ja mal bei euch kompilieren und starten.

Erstellt vorher auf D: die test.txt und guckt, ob diese nach dem starten des Services gelöscht wurde.

Würde mich echt riesig freuen, wenn ich den Fehler finde :/

Vielen Dank schonmal an euch alle :)

LG XspYroX

Geschrieben (bearbeitet)

Du solltest da ganz schnell die MessageBox rausnehmen. Dienste sind nicht interaktiv. Es gibt niemanden, der diese MessageBox sieht, und damit auch niemanden, der sie bestätigen könnte. Damit hängt dein Dienst beim Stoppen.

Nachtrag: Funktioniert bei mir (mit C:\temp als Pfad, hab kein D: zum Schreiben).

Bearbeitet von Klotzkopp
Geschrieben

Wenn ich die MessageBox einbaue, erhalte ich beim Beenden des Dienstes diesen Fehler:

---------------------------

Dienste

---------------------------

Der Dienst "test Service" auf "Lokaler Computer" konnte nicht beendet werden.

Der Dienst hat keinen Fehler zurückgegeben. Es kann sich um einen internen Windows-Fehler oder einen internen Dienstfehler handeln.

Setzen Sie sich mit Ihrem Systemadministrator in Verbindung, falls das Problem weiterhin besteht.

---------------------------

OK

---------------------------

Der Dienst bleibt im Zustand "gestartet".

Beim nächsten Versuch, ihn zu beenden, dann:

---------------------------

Dienste

---------------------------

Der Dienst "test Service" auf "Lokaler Computer" konnte nicht beendet werden.

Fehler 1061: Der Dienst kann zurzeit keine Steuerungsmeldungen annehmen.

---------------------------

OK

---------------------------

Ich weiß nicht, was du da startest, aber ich vermute, es ist nicht der Dienst, den du da gebaut hast. Prüf mal in der Systemsteuerung, ob der Pfad stimmt.

Geschrieben

Ach verdammt -_-

Ich hab die ganze zeit die exe aus dem debug-ordner installiert....

Ich probiers mal grad mit der aus dem release-ordern :(((((((((((((

edit: bin halt von Visual Basic umgestiege. Da war es imemr der rebug-ordner aus dem ich die exe genommen hab...

Geschrieben

**** ja, es geht jetzt.

Sorry, dass ich euch alle mit dem code aufgehalten habe.

Aber anscheinend muss man auch ein wenig mitdenken und die richtige Exe installieren -_____________-

..... Ich vergrab mich dann grad mal im Boden x_x

Tausend Dank ._____.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...