用C#开发Windows服务监控系统使用

简介:
摘要  本文将向你展示如何用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的命令提示符下。

在控制台下,转到服务的Debug文件夹下:

输入"InstallUtil Monitoring.exe"

如果它显示"Commit Phase Completed Successfully",则说明服务被成功安装。

然后,重启系统以启动服务。在重启之后,打开file1.xml文件,它记录了系统的开始时间。如果关闭系统,它将记录下系统的关闭时间和使用系统的时间长度。通过这一部分,我们已经完成了记录下系统所消耗的时间。接下来,我们将创建一个web应用程序以便在一个Grid控件中显示xml数据。

在下一部分中,我将解释如何抽取这个xml文件数据并且在一个DataGrid控件中显示它。
四、 用C#创建一个Web应用程序

  在这一部分中,我们用C#创建一个web应用程序,并命名为SystemMonitor。

加入下面命名空间:

using System.IO;
using System.Xml;
using System.Text;

之后,把DataGrid和Label控件拖动到页面上,如下图所示:

点击放大此图片

把下列代码复制到Page_Load事件中:

File.Copy("c:\\file1.xml","c:\\temp1.xml",true);
StreamWriter writer1=File.AppendText("c:\\temp1.xml");
writer1.Write("<shutdown>undefined</shutdown>");
writer1.Write("<timespent>undefined</timespent>");
writer1.Write("</time>");
writer1.WriteLine("</times>");
writer1.Close();
DataSet ds=new DataSet();
ds.ReadXml("c:\\temp1.xml");
TimeSpan t=new TimeSpan();
DataGrid1.DataSource=ds;
DataGrid1.DataBind();
XmlTextReader reader=new XmlTextReader("c:\\temp1.xml");
while(reader.Read())
{
if(reader.NodeType==XmlNodeType.Element)
{
if(reader.Name=="timespent")
{
string temp11=reader.ReadInnerXml().ToString();
if(temp11!="undefined")
{
temp11=temp11.Replace(":",".");
temp11=temp11.Replace(" ","");
duration +=Convert.ToDouble(temp11);
}
}
}
}
Response.Write("Total Duration is : ");
double temp122=Convert.ToDouble(duration);
string hr=temp122.ToString();
string hrstr=hr.Substring(0,hr.IndexOf("."));
Response.Write(hrstr.ToString()+" Hours");
string mins=hr.Substring(hr.IndexOf(".")+1,(hr.Length -hr.IndexOf(".")-1));
Response.Write(" "+mins.ToString()+" Minutes");
reader.Close();
File.Delete("c:\\temp1.xml");

最后把下面的声明粘贴到Page_Load事件上部:

private double duration;

我解释一下程序在Page_Load事件中做了什么。

首先,我把文件file1.xml(它包含系统定时信息)的内容复制到临时文件中。然后,我把一些标记添加到该临时文件中。之后,我把temp的内容读取到一个dataset中,最后把它绑定到一个DataGrid中。以后,我创建逻辑来查找所有花费的时间。

我非常希望每个人都能理解上面的代码。

上面页面的输出结果大致如下图所示:

点击放大此图片



















本文转自朱先忠老师51CTO博客,原文链接: http://blog.51cto.com/zhuxianzhong/59366,如需转载请自行联系原作者

相关文章
|
8天前
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
|
20天前
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
54 12
|
2月前
|
前端开发 JavaScript 安全
C#一分钟浅谈:Blazor WebAssembly 开发
Blazor WebAssembly 是一个客户端框架,允许开发者使用C#和Razor语法构建Web应用。本文介绍了Blazor WebAssembly的基本概念、常见问题及解决方案,包括路由配置、数据绑定、异步操作、状态管理和性能优化等方面的内容,并分享了一些易错点及如何避免的方法。希望这些内容能帮助你在Blazor WebAssembly开发中少走弯路,提高开发效率。
128 51
|
21天前
|
存储 监控 算法
企业内网监控系统中基于哈希表的 C# 算法解析
在企业内网监控系统中,哈希表作为一种高效的数据结构,能够快速处理大量网络连接和用户操作记录,确保网络安全与效率。通过C#代码示例展示了如何使用哈希表存储和管理用户的登录时间、访问IP及操作行为等信息,实现快速的查找、插入和删除操作。哈希表的应用显著提升了系统的实时性和准确性,尽管存在哈希冲突等问题,但通过合理设计哈希函数和冲突解决策略,可以确保系统稳定运行,为企业提供有力的安全保障。
|
2月前
|
安全 Windows
【Azure Cloud Service】在Windows系统中抓取网络包 ( 不需要另外安全抓包工具)
通常,在生产环境中,为了保证系统环境的安全和纯粹,是不建议安装其它软件或排查工具(如果可以安装,也是需要走审批流程)。 本文将介绍一种,不用安装Wireshark / tcpdump 等工具,使用Windows系统自带的 netsh trace 命令来获取网络包的步骤
89 32
|
2月前
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。
147 4
|
2月前
|
开发框架 缓存 .NET
C# 一分钟浅谈:Blazor Server 端开发
Blazor Server 是基于 ASP.NET Core 的框架,允许使用 C# 和 Razor 语法构建交互式 Web 应用。本文介绍 Blazor Server 的基本概念、快速入门、常见问题及解决方案,帮助开发者快速上手。涵盖创建应用、基本组件、数据绑定、状态管理、跨组件通信、错误处理和性能优化等内容。
92 1
|
2月前
|
缓存 C# 开发者
C# 一分钟浅谈:Blazor Server 端开发
本文介绍了 Blazor Server,一种基于 .NET 的 Web 开发模型,允许使用 C# 和 Razor 语法构建交互式 Web 应用。文章从基础概念、创建应用、常见问题及解决方案、易错点及避免方法等方面详细讲解,帮助开发者快速上手并提高开发效率。
75 2
|
2月前
|
测试技术 Go C#
C#一分钟浅谈:ReSharper 插件增强开发效率
【10月更文挑战第25天】ReSharper 是 JetBrains 开发的一款 Visual Studio 插件,旨在提高 .NET 开发者的生产力。它通过代码分析、重构、导航等功能,帮助开发者避免常见错误,提升代码质量和开发效率。本文将通过具体代码案例,详细介绍 ReSharper 的常见功能及其应用。
62 1
|
监控 Windows
监控Windows操作 记录系统动作
http://softbbs.pconline.com.cn/10096274.html
592 0