Basic implementation
We started of by implementing the management agent run functionality in C# by calling the WMI interface using the System.Management library.ManagementScope ms = new ManagementScope(wmiNs);
string query = "Select * from MIIS_ManagementAgent";
SelectQuery sq = new SelectQuery(query);
using (ManagementObjectSearcher mos
= new ManagementObjectSearcher(ms, sq)) {
foreach (ManagementObject obj in mos.Get()){
using (ManagementObject ma = obj){
object[] param = new object[] {runProfile};
ma.InvokeMethod("Execute",param);
}
}
}
So far so good, but we do not want to recompile our code every time we want to change our schedule. Therefore, we put our scheduling configuration in an xml file and let the program read our xml configuration. We defined two kind of objects: runConfiguration and sequence. Both objects contain one or more step objects. There is no difference in the definition of runConfiguration and sequence, but only runConfigurations can be used as the starting point of a schedule. A step can be one of three types:
- a linear sequence: all steps are executed one after the other
- a parallel sequence: all steps are executed in parallel
- a management agent: the run profile defined in the Action attribute is run for the management agent
We gave every type of step a different implementation, so the result has the following structure:
Windows service
It is very easy to create a windows service with Visual Studio since it is a standart project template called, surprisingly, Windows Service.All we needed to do was add an installer so that the executable can be installed as a service using sc.exe or installUtil.exe. There are some very good tutorials on how to create a windows service, so I'll just give you the link I used: Creating a Windows Service Application.
Scheduling
At the moment we have a program that is capable of running a given schedule and a windows service. The last issue we need to resolve is how we are going to perform the actual scheduling. Some googling gives you some options, and we chose to use the Quartz .NET library.After some trial and error we succeeded in configuring a Quartz scheduler that read his configuration from a file and started a job. Then it was just a matter of implementing this job so that it would start the steps in the runconfiguration specified by the Quartz configuration file.Quartz.NET is a full-featured, open source job scheduling system that can be used from smallest apps to large scale enterprise systems. Quartz.NET is a pure .NET library written in C# and is a port of very propular open source Java job scheduling framework, Quartz . This project owes very much to original Java project, it's father James House and the project contributors.
Resources
Creating a Windows Service ApplicationQuartz .NET
FIM-Scheduler