XspYroX Geschrieben 7. Januar 2013 Geschrieben 7. Januar 2013 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 Zitieren
SilentDemise Geschrieben 7. Januar 2013 Geschrieben 7. Januar 2013 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). Zitieren
XspYroX Geschrieben 8. Januar 2013 Autor Geschrieben 8. Januar 2013 Werde es morgen früh ausprobieren. Also soll ich einfach die main() in der OnStart aufrufen? Zitieren
XspYroX Geschrieben 8. Januar 2013 Autor Geschrieben 8. Januar 2013 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? Zitieren
Shadak Geschrieben 8. Januar 2013 Geschrieben 8. Januar 2013 also ich hab ja keine ahnung vom services programmieren, aber mir kommt das c:\\test.txt komisch vor...ein \ zu viel, oder? Zitieren
XspYroX Geschrieben 8. Januar 2013 Autor Geschrieben 8. Januar 2013 Die 2 "\\" sind zum escapen. Hat nichts mit Dienstprogrammierung zu tun, sondern allgemein mit Programmierung Zitieren
Pixie Geschrieben 8. Januar 2013 Geschrieben 8. Januar 2013 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? Zitieren
XspYroX Geschrieben 8. Januar 2013 Autor Geschrieben 8. Januar 2013 (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 8. Januar 2013 von XspYroX Zitieren
HJST1979 Geschrieben 9. Januar 2013 Geschrieben 9. Januar 2013 Hallo XspYroX auf folgendes bist du noch überhaupt nicht eingegangen, schon überprüft ?? Hat network service schreibrechte auf C? Gruß Hans-Jörg Zitieren
XspYroX Geschrieben 9. Januar 2013 Autor Geschrieben 9. Januar 2013 (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 9. Januar 2013 von XspYroX Zitieren
Goulasz Geschrieben 9. Januar 2013 Geschrieben 9. Januar 2013 (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 9. Januar 2013 von Goulasz Zitieren
SilentDemise Geschrieben 9. Januar 2013 Geschrieben 9. Januar 2013 Ziege Bro....schmeiß die Enterprise Library in die Tonne. System.Diagnostics.Trace ist dein Freund ;-) (und MSI ist großer Mist, gerade für Services) Zitieren
XspYroX Geschrieben 10. Januar 2013 Autor Geschrieben 10. Januar 2013 (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 10. Januar 2013 von XspYroX Zitieren
SilentDemise Geschrieben 10. Januar 2013 Geschrieben 10. Januar 2013 was ich dir gesagt habe, der Service hat keine Schreibrechte. Der Service Account sollte eben nicht local system sein, sondern ein angelegter User, der explizit Rechte auf den Ordner hat. Zitieren
XspYroX Geschrieben 10. Januar 2013 Autor Geschrieben 10. Januar 2013 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? Zitieren
Goulasz Geschrieben 10. Januar 2013 Geschrieben 10. Januar 2013 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... Zitieren
XspYroX Geschrieben 10. Januar 2013 Autor Geschrieben 10. Januar 2013 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 Zitieren
HJST1979 Geschrieben 10. Januar 2013 Geschrieben 10. Januar 2013 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 Zitieren
XspYroX Geschrieben 10. Januar 2013 Autor Geschrieben 10. Januar 2013 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 :/ Zitieren
XspYroX Geschrieben 11. Januar 2013 Autor Geschrieben 11. Januar 2013 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 Zitieren
Klotzkopp Geschrieben 11. Januar 2013 Geschrieben 11. Januar 2013 (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 11. Januar 2013 von Klotzkopp Zitieren
XspYroX Geschrieben 11. Januar 2013 Autor Geschrieben 11. Januar 2013 Hab sie rausgenommen -> keine Änderung. Wenn, dann hätte der Dienst ja onStop, also beim beenden hängen müssen. Tat er aber auch nicht... :/ Zitieren
Klotzkopp Geschrieben 11. Januar 2013 Geschrieben 11. Januar 2013 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. Zitieren
XspYroX Geschrieben 11. Januar 2013 Autor Geschrieben 11. Januar 2013 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... Zitieren
XspYroX Geschrieben 11. Januar 2013 Autor Geschrieben 11. Januar 2013 **** 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 ._____. Zitieren
Empfohlene Beiträge
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.