最近经常在我的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、在系统的服务中可看到我们创建的服务。
一下内容来自于: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. 下断点。
5. 在服务控制台管理器中启动服务。
6. 以下操作必须在 15 秒内完成,否则无法进入调试状态(因为 Debug.WriteLine 已经执行完了)。
7. VS2010 中 “工具 –> 附加到进程”。
8. 选择好服务所在的进程(我这里的服务进程为 WorkTracker.Service.exe),然后单击附加后就慢慢等待 15 秒钟的过去吧。
9. 15 秒到达时,我们的服务就会进入到调试状态了,然后再 VS 中就可以来调试服务了。