Windows Service erstellen
Hey zusammen,
Ich habe mir überlegt, einen eigenen Service für einen Server zu schreiben, der mich informieren soll, sobald eine Datei unter einem bestimmten Pfad geändert wird. Dafür habe ich folgenden PS Script gefunden:
File Monitoring - PowerShell
Kurzfassung:
In einer Dauerschleife wird mittels System.IO.FileSystemWatcher ein Pfad mit bestimmten Kriterien überwacht (Änderung der Datei, erstellen von Dateien, löschen von Dateien etc.).
Als Übung wollte ich mir dann einen neuen Dienst für Windows erstellen, welcher genau dafür gedacht ist. Beim Recherchieren habe ich folgende Methoden gefunden, die ich für den Dienst benötige:
- OnStart( )
- OnPause( )
- OnContinue( )
- OnStop( )
Ist es überhaupt sinnvoll, das ganze über einen Windows Dienst zu implementieren? Meine Idee wäre nun, bei den Methoden OnStart und OnContinue einen separaten Thread zu starten, der diese Dauerschleife ausführt, und diesen in den Methoden OnPause und OnStop zu stoppen.
Da ich generell im Programmieren von Threads und Services noch überhaupt keine Erfahrung habe, wollte ich mich erkundigen, ob das eventuell der richtige Ansatz sein könnte oder ob es dafür einen "schöneren" oder sinnvolleren Weg gibt, da mir empfohlen wurde, Threads so gut wie möglich zu vermeiden .
Cheers,
Micha
Ich habe mir überlegt, einen eigenen Service für einen Server zu schreiben, der mich informieren soll, sobald eine Datei unter einem bestimmten Pfad geändert wird. Dafür habe ich folgenden PS Script gefunden:
File Monitoring - PowerShell
Kurzfassung:
In einer Dauerschleife wird mittels System.IO.FileSystemWatcher ein Pfad mit bestimmten Kriterien überwacht (Änderung der Datei, erstellen von Dateien, löschen von Dateien etc.).
Als Übung wollte ich mir dann einen neuen Dienst für Windows erstellen, welcher genau dafür gedacht ist. Beim Recherchieren habe ich folgende Methoden gefunden, die ich für den Dienst benötige:
- OnStart( )
- OnPause( )
- OnContinue( )
- OnStop( )
Ist es überhaupt sinnvoll, das ganze über einen Windows Dienst zu implementieren? Meine Idee wäre nun, bei den Methoden OnStart und OnContinue einen separaten Thread zu starten, der diese Dauerschleife ausführt, und diesen in den Methoden OnPause und OnStop zu stoppen.
Da ich generell im Programmieren von Threads und Services noch überhaupt keine Erfahrung habe, wollte ich mich erkundigen, ob das eventuell der richtige Ansatz sein könnte oder ob es dafür einen "schöneren" oder sinnvolleren Weg gibt, da mir empfohlen wurde, Threads so gut wie möglich zu vermeiden .
Cheers,
Micha
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 24188964237
Url: https://administrator.de/contentid/24188964237
Ausgedruckt am: 21.11.2024 um 21:11 Uhr
10 Kommentare
Neuester Kommentar
Für sowas brauchst du kein Extra Dienst schreiben. Dafür reicht die Server-Rolle File Server Resource Manager (FSRM) die bereits in Windows integriert ist i.d.R. völlig aus. da kannst du Regeln für Dateien und Dateitypen erstellen und definieren was dann geschehen soll und natürlich auch eigene Skripte mit Parameterübergabe aufrufen.
Aber wenn das eh nur eine Übung sein soll, dann leg halt einfach mal los. Erfahrung sammeln ist immer gut ...
Gruß sid.
Aber wenn das eh nur eine Übung sein soll, dann leg halt einfach mal los. Erfahrung sammeln ist immer gut ...
Gruß sid.
Zitat von @michi.wtr:
Aber ein Skript in Dauerschleife ist unsicher. Aufgabenplanung kannst du recht einfach das Skript jede Minute ausführen und schauen ob die Datei in den letzten 60 Sekunden verändert wurde. Da brauchst du auch nach einem Serverneustart nicht drüber nachdenken, da die Aufgabe dann automatisch gestartet wird. Besser als ein Skript in Endlosschleife.Zitat von @Kraemer:
wenn du schon ein PS-Script hast, warum nutzt du das nicht einfach und realisierst das ganze über die Aufgabenplanung?
Naja, würde theoretisch gehen, die geplante Aufgabe sollte dann aber theoretisch 24/7 ausgeführt werden, also eigentlich soll auf den Server der Pfad dauerhaft überwacht werden. Im Prinzip könnte ich ja auch das Skript einfach einmal starten, das wird dann auch dauerhaft ausgeführt, zur Not auch noch unter einer anderen Hintergrund Session, das würde ich dann nicht einmal mitbekommen.wenn du schon ein PS-Script hast, warum nutzt du das nicht einfach und realisierst das ganze über die Aufgabenplanung?
Jedoch bin ich grade in der Ausbildung für Anwendungsentwicklung und dachte mir das wäre schön das ganze als eigenen Dienst zu implementieren. So würde die Überwachung stetig im Hintergrund laufen und könnte auch von Admins einfach gestoppt oder wieder gestartet werden.
Admins können auch Aufgaben der Aufgabenplanung einfach starten und stoppen Davon abgesehen: Jedes anständige Monitoring-Programm kann es entweder von Haus aus oder kann dein PS-Skript verarbeiten. Hat den Vorteil, dass du im Monitoring bereits eine vernünftige Auswertung und Aufschlüsselung fahren kannst. Beim Dienst nicht so wirklich.
Gruß
Doskias
ja ne - ist klar...
Wie kommt man nur auf solch einfältige Kommentare?
Wie kommt man nur auf solch einfältige Kommentare?
Moin,
Du musst die Hashwertwerte nur nachhaltig speichern. Wenn jemand den Task/ Dienst beendet, die Datei ersetzt und den Task/ Dienst wieder startet und der Hashwert nur zur Laufzeit des Skript im Speicher liegt, hast du verloren…
Wenn sich jetzt ein Dateiname in den 60 Sekunden ändert, dann weiß ich ja nicht ob die Datei gelöscht und eine andere dafür erstellt wurde. Ich meine wenn die Namen zu 100% immer gleich bleiben, dann kann ich das wissen und nur die LastWriteTime anschauen.
Das kann man einfach prüfen:- im ersten Lauf: Hashwert der Datei speichern
- Datei weg: Event auslösen
- Datei-Hash anders: Event auslösen
Du musst die Hashwertwerte nur nachhaltig speichern. Wenn jemand den Task/ Dienst beendet, die Datei ersetzt und den Task/ Dienst wieder startet und der Hashwert nur zur Laufzeit des Skript im Speicher liegt, hast du verloren…
Ein richtiger Dienst ist sehr sinnvoll wegen der Vielzahl der Möglichkeiten und Werkzeugen.
Mit Visual Studio geht das gut.
Mit Visual Studio geht das gut.
Moin, das Problem hatte ich mit meiner Software.
Ich habe es so gelöst dass ich meinen ganzen Code entkoppelt habe und 2 Projekte zum Starten vom eigentlichen Code habe. Einer davon ist der Dienst und der andere ist eine Consolenapplikation.
Hiermit initialisiere ich und starte es im Dienst:
Und das ist die Consolenapplikation:
Hier kannst du es nachsehen: https://github.com/canlot/Installation-Agent/tree/v2
Du brauchst dafür dann aber 3 unterschiedliche Projekte in einer Solution.
Ich habe es so gelöst dass ich meinen ganzen Code entkoppelt habe und 2 Projekte zum Starten vom eigentlichen Code habe. Einer davon ist der Dienst und der andere ist eine Consolenapplikation.
Hiermit initialisiere ich und starte es im Dienst:
public partial class InstallationService : ServiceBase
{
Controller.ServiceController controller;
public InstallationService()
{
InitializeComponent();
controller = new Controller.ServiceController();
}
protected override void OnStart(string[] args)
{
controller.Start();
}
protected override void OnStop()
{
controller.Stop().Wait();
}
private void process1_Exited(object sender, EventArgs e)
{
}
}
class Program
{
static void Main(string[] args)
{
ServiceController controller = new ServiceController();
controller.Start(false);
Console.Read();
controller.Stop().Wait();
Console.Read();
}
}
Hier kannst du es nachsehen: https://github.com/canlot/Installation-Agent/tree/v2
Du brauchst dafür dann aber 3 unterschiedliche Projekte in einer Solution.