编写C# Windows服务,用于杀死Zsd.exe进程

最近经常在我的xp系统进程中出现Zsd.exe进程。刚开始他占用内存不是很大。但是过了一段时间就会变成几百M

机器就会变得很卡,网上说Zsd可能是病毒。所以我就想要不写一个Windows服务,让他每隔几秒钟去kill 掉Zsd.exe

下面是我用VS编写服务程序的过程,为了以后随时查阅,现在把它记录下来。

1、新建C# Windows服务:windows service工程

新建windows service工程

    2、新建windows service工程后,系统自动生成一个Service1.cs文件,默认是其设计视图。选择查看其代码,默认有构造函数、OnStart、OnStop三个函数,如下图所示:

设计视图 

   3、新建了C# Windows服务之后,还要设置该服务运行的周期,左侧的ToolBox中有两个timmer,一个在组件下,一个在windows form下,可惜这两个都不能用,我们要手工新建一个timmer,并设置其属性和事件。

private System.Timers.Timer t = null;
private System.Timers.ElapsedEventHandler eehandler = null;

protected override void OnStart(string[] args)
{
  t = new System.Timers.Timer(10000);//实例化Timer类,设置间隔时间为10000毫秒;
  eehandler = new System.Timers.ElapsedEventHandler(TimeElapse);
  t.Elapsed += eehandler;//到达时间的时候执行事件;
  t.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
  t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
}

private void KillProcess(string processName)
{
  System.Diagnostics.Process myproc = new System.Diagnostics.Process();
  //得到所有打开的进程
  try
  {
    foreach (Process thisproc in Process.GetProcessesByName(processName))
    {
      if (!thisproc.CloseMainWindow())
      {
        thisproc.Kill();
      }
    }
  }
  catch (System.Exception ex)
  {
    EventLog log = new EventLog();
    log.Source = "我的应用程序";
    log.WriteEntry(ex.Message, EventLogEntryType.Error);
  }
}

public void TimeElapse(object source, System.Timers.ElapsedEventArgs e)
{
  KillProcess("Zsd");
}
protected override void OnStop()
{
  t.Enabled = false;
  t.Elapsed -= eehandler;
  t.Close();
  t = null;
}

   4、服务编写之后,还不能由SCM(服务控制管理器)进行管理,需要给该服务添加装载器。在Service1.cs的设计视图,点击右键,选择“添加装载器”,系统默认就会添加ProjectInstaller.cs这个类。

Service1.cs的设计视图  

    5、添加该类后,在该类的设计视图上可看到serviceInstaller1和serviceProcessInstaller1,分别设置其属性。

    设置serviceInstaller1的运行方式为手动或者自动

    设置serviceInstaller1的ServiceName,设置为什么,服务列表中就显示什么

    设置serviceProcessInstaller1的运行账号为LocalSystem

    6、编译该工程

    7、使用vs自带的命令行工具,运行installutil 编译生成的exe

    8、在系统的服务中可看到我们创建的服务。

一下内容来自于:http://www.cnblogs.com/BoyXiao/archive/2011/08/07/2130208.html

服务调试:

服务的调试是比较变态的,方法貌似也还是有几种,

不过我呢,反正也就知道下面一种而已,个人觉得这种方式也还用得下去,即调试起来感觉还不错的 !

1. 首先在你的服务源代码中添加一个定时器,定时器的示例代码如上所示。

2. 在服务的 Start 事件中启动定时器,并且将定时器设置为可用状态。

3. 在服务中添加如下代码:(我的定时器为 3 秒钟,所以 15 秒后就会执行 Debug.WriteLine 了)

   1:          private Int32 nCount = 0;
   2:   
   3:          /// <summary>
   4:          /// 定时器回调处理例程
   5:          /// </summary>
   6:          /// <param name="source"></param>
   7:          /// <param name="e"></param>
   8:          private void Timer_Tick(object source, System.Timers.ElapsedEventArgs e)
   9:          {
  10:              nCount++;
  11:              if (nCount == 5)
  12:              {
  13:                  Debug.WriteLine("In Timer_Tick !");
  14:              }

3. 编译和安装好服务。

4. 下断点。

image_thumb26

5. 在服务控制台管理器中启动服务。

6. 以下操作必须在 15 秒内完成,否则无法进入调试状态(因为 Debug.WriteLine 已经执行完了)。

7. VS2010 中 “工具 –> 附加到进程”。

image_thumb31

8. 选择好服务所在的进程(我这里的服务进程为 WorkTracker.Service.exe),然后单击附加后就慢慢等待 15 秒钟的过去吧。

9. 15 秒到达时,我们的服务就会进入到调试状态了,然后再 VS 中就可以来调试服务了。

image_thumb37

    

原文地址:https://www.cnblogs.com/guoyongrong/p/3424253.html