这里是别人的书写,如果可以的话,我再整理一下.
摘要 本文将向你展示如何用C#开发一个Windows服务来记录系统使用情况。
每一个人都想知道他们每天在什么时间启动和关闭自己的系统,以及系统每天运行了多少时间。如果用一个DataGrid控件来显示系统启动、关闭及所消耗的时间将是一个不错的主意。
在本文中,我提供了一种方法来实现这一目标-使用C#开发一个Windows服务。其实,每个人都了解一点Windows服务。但是,为了介绍之目的,我仅尽可能少得解释一下Windows服务。然后,我们来讨论如何设计一个这样的应用程序。
一、 什么是Windows服务?
其实,Windows服务只是运行于后台的并不要求我们了解的一种进程而已。而且,它们的绝大部分并不要求用户交互。如果我们在"开始"菜单的"运行"命令行下输入"services.msc"并回车,那么我们就可以看到在我们当前的系统中运行的服务情况。其中,有一些服务是当系统启动时自动启动的。但是,也有一些服务必须在我们的手工启动下才能运行。
二、 Windows服务的优点
1. 能够自动运行。
2. 不要求用户交互。
3. 在后台运行。
一般情况下,Windows服务被用于耗费时间很多的进程中,例如备份数据库,等等。
现在,我们要设计一个Windows服务来实现记录你的系统启动和关闭需要的时间。我使用Visual Studio 2003设计了这个应用程序。
三、 设计Windows服务
第一步:
首先打开Visual Studio并且选择Visual C#工程。选择模板类型为Windows服务,并命名为Monitoring,如下图所示:
按F7键打开代码窗口。然后,加入对System.IO命名空间的引用,以便把系统定时功能编写到一个文件中。下一步,用Monitoring一词替换所有出现的Service1一词。之后,转入设计模式(按键shift+F7)。选择Solution Explorer(按键Ctrl+Alt+L)。点击Service1.cs并且命名它为Monitoring.cs。
之后,转入代码窗口。在OnStart事件中加入下列代码,如下图所示:
在OnStart事件中实现的功能
首先,在c盘上创建一个xml文件,并命名为file1。然后,在这个文件中建立如下代码:
<?xml version="1.0" encoding="utf-8" standalone="no"?> <times> |
然后,关闭它。
我创建了一个服务,它能够在系统启动时自动启动并且记录下启动时间。当系统关闭时,它也关闭。而且,它会记录下关闭时间和系统中所花费的时间。
首先,我要创建一个StreamWriter来把系统启动时间写入file1.xml文件中。
在把代码复制到你的OnStart事件后,正好在Monitoring构造器的上面创建一个公共变量temp,如下图所示:
此后,把这部分代码复制到你的代码窗口:
再把下面代码复制到OnStart事件中,如下图所示:
StreamWriter writer=File.AppendText("d:\\file1.xml"); writer.Write("<time>"); writer.WriteLine("<Date> "+ (DateTime.Now.ToString("dd-MM-yy"))+"</Date>"); writer.WriteLine("<started> "+ (DateTime.Now.ToString("t"))+"</started>"); temp=DateTime.Now; writer.Close(); |
在OnShutdown事件中实现的功能
当系统要关闭时,我使用一个StreamWriter再次打开file1.xml-它将记下系统关闭时间,还将记下在系统启动和关闭之间所花费的时间跨度。我在OnStart和OnShutdown事件中使用了一个temp变量。在OnStart中,它用于存储启动时间。然后,它被再次用于OnShutdown事件中来记下系统启动和关闭之间所花费的时间间隔。
然后,我们必须配置我们的Windows服务以便安装和运行。
因此,首先转到设计视图中,并选择属性窗口(可以按下F4)。
把CanStop和CanShutdown设置为true。在安装之前,我们必须要安装一个安装程序。
右击设计视图窗口,然后选择"Add Installer"。然后,它将显示ProjectInstaller.cs。在这个文件中,serviceInstaller1和serviceProcessInstaller1都存在。转到serviceProcessInstaller1属性处:
· 把Account设置为LocalSystem。
· 然后,转到serviceInstaller1属性处。
· 把DisplayName和ServiceName设置为Monitoring。
· 设置启动类型(StartType)为automatic。
请参考下图:
然后,转到VS.NET的命令提示符下。
也可以直接用cmd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 InstallUtil 程序目录
在控制台下,转到服务的Debug文件夹下:
输入"InstallUtil Monitoring.exe" (记住这个命令在sdk命令提示符下)
如果它显示"Commit Phase Completed Successfully",则说明服务被成功安装。
然后,重启系统以启动服务。在重启之后,打开file1.xml文件,它记录了系统的开始时间。如果关闭系统,它将记录下系统的关闭时间和使用系统的时间长度。通过这一部分,我们已经完成了记录下系统所消耗的时间。接下来,我们将创建一个web应用程序以便在一个Grid控件中显示xml数据。
在下一部分中,我将解释如何抽取这个xml文件数据并且在一个DataGrid控件中显示它。
装上了服务就要卸载.下面就是卸载服务的步骤.
在查看“管理工具”→ “ 服务” 时会发现有一些被插件或者病毒安装的服务,首先想到的是禁用它,可是禁用后还是有些想法,比如删除文件、卸载服务。下面就简单地介绍一下如何卸载服务:
在“管理工具”→ “ 服务”里找到你要卸载的服务,双击打开它的属性,比如查看“卡巴斯基反病毒6.0个人版”的属性,可以看到如下描述:
服务名称:AVP
显示名称:卡巴斯基反病毒6.0个人版
然后打开注册表(运行regedit),依次打开HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,
在Services下找到你要卸载的服务的名称,上例中即为AVP,删除整个AVP项,重启计算机后就把该服务完全卸载了。
另外,在卸载服务前也可以把关联的文件删除,在服务的属性中“可执行文件的路径”下即为其关联的文件。
这样整个开发到卸载就完成了,谢谢.
安装过程中遇到的问题
1 .遇到了安装需要设置用户名和密码
在 ProjectInstaller.cs 中 转定义 InitializeComponent(); 中
/// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();
//
// serviceProcessInstaller1
//
//第一句需要加的 设置服务的启动类型
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
//------------------------------------
this.serviceProcessInstaller1.Password = null;
this.serviceProcessInstaller1.Username = null;
//
// serviceInstaller1
//
this.serviceInstaller1.ServiceName = "DownSeoService";
//启动类型,手动,自动,禁止
this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
//
// ProjectInstaller
//
this.Installers.AddRange(new System.Configuration.Install.Installer[] {
this.serviceProcessInstaller1,
this.serviceInstaller1});
}