• 编写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

        

  • 相关阅读:
    EF-一对一关系
    EF-生成迁移版本
    打包、压缩指令
    gut pull 拉取出错
    nohup的使用方法
    fopen打开文件出错
    实现多线程下载图片到本地③
    实现单线程下载图片到本地②
    服务器重装系统后终端登录不上去
    简单实现图片抓取下载到本地①
  • 原文地址:https://www.cnblogs.com/guoyongrong/p/3424253.html
Copyright © 2020-2023  润新知