using System;
using System.ServiceProcess;
using System.Diagnostics;
using System.Timers;
using System.Xml;
using System.Management;

public class PWatch : ServiceBase {
 protected ManagementObjectSearcher objS;
 protected ObjectQuery objQ;
 protected Timer timer;
 protected XmlDocument xmldoc;
 protected XmlNodeList watchList;
 protected string smtpServer;
 protected string smtpFrom;
 protected string smtpTo;
 protected string smtpSubject;
 protected string smtpBody;

 public static void Main() {
  ServiceBase.Run(new PWatch());
 }

 public PWatch() {
  CanPauseAndContinue = true;
  ServiceName = "ProcessWatch";

  objQ = new ObjectQuery();
  objS = new ManagementObjectSearcher(objQ);

  xmldoc = new XmlDocument();
  timer = new Timer();
 }

 protected void SmtpMail(string name) {
  System.Web.Mail.SmtpMail.SmtpServer = smtpServer;
  System.Web.Mail.SmtpMail.Send(
   smtpFrom, smtpTo, smtpSubject, name + " " + smtpBody);
 }

 protected void ChkProcess(string name) {
  Boolean flg = false;
  objQ.QueryString = "Select Name from Win32_Process where Name='" + name + "'";
  objS.Query = objQ;

  ManagementObjectCollection moc = objS.Get();
  if( moc.Count != 0 ) {
   flg = true;
  }
  moc.Dispose();
  moc = null;

  if( flg == false ) {
   EventLog.WriteEntry("ChkProcess Error: " + name);
   SmtpMail(name);
  }
  GC.Collect();
 }

 protected override void OnStart(string[] args) {
  EventLog.WriteEntry("ProcesWatch Service started");

  xmldoc.Load("pwatch.xml");
  XmlElement root = xmldoc.DocumentElement;
  XmlNodeList list = root.GetElementsByTagName("watch_interval");
  timer.Interval = Convert.ToInt32(list[0].FirstChild.Value);

  list = root.GetElementsByTagName("smtpserver");
  smtpServer = list[0].FirstChild.Value;

  list = root.GetElementsByTagName("from");
  smtpFrom = list[0].FirstChild.Value;

  list = root.GetElementsByTagName("to");
  smtpTo = list[0].FirstChild.Value;

  list = root.GetElementsByTagName("subject");
  smtpSubject = list[0].FirstChild.Value;

  list = root.GetElementsByTagName("body");
  smtpBody = list[0].FirstChild.Value;
  
  watchList = root.GetElementsByTagName("watch");

  timer.Elapsed += new ElapsedEventHandler(OnTimer);
  timer.Enabled = true;
 }

 protected override void OnStop() {
  EventLog.WriteEntry("ProcessWatch Service stopped");
  timer.Enabled = false;
 }

 protected override void OnPause() {
  EventLog.WriteEntry("ProcessWatch Service paused");
  timer.Enabled = false;
 }

 protected override void OnContinue() {
  EventLog.WriteEntry("ProcessWatch Service continued");
  timer.Enabled = true;
 }

 protected void OnTimer(Object source, ElapsedEventArgs e) {
  for(int i=0; i<watchList.Count; i++) {
   // EventLog.WriteEntry(watchList[i].FirstChild.Value;
   ChkProcess(watchList[i].FirstChild.Value);
  }
 }
}