您的位置:首页 > 编程语言 > C#

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

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

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

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

1、新建C# Windows服务: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这个类。





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

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

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

设置serviceProcessInstaller1的运行账号为LocalSystem

6、编译该工程

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

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

一下内容来自于:/article/4910398.html

服务调试:

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

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

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

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

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

        private Int32 nCount = 0;




       /// <summary>


       /// 定时器回调处理例程


       /// </summary>


       /// <param name="source"></param>


       /// <param name="e"></param>


       private void Timer_Tick(object source, System.Timers.ElapsedEventArgs e)


       {


           nCount++;


           if (nCount == 5)


           {


               Debug.WriteLine("In Timer_Tick !");


           }


3. 编译和安装好服务。

4. 下断点。





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

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

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





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

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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: