C#开发Windows服务实例之实现禁止QQ运行

 更新时间:2013年10月11日 11:46:26   作者:  
这篇文章主要介绍了通过C#开发Windows服务,查杀qq进程的服务功能,需要的朋友可以参考下

本实例主要实现下面三个基本功能

1、C#开发windows服务

2、禁止QQ等程序运行

3、为windows服务创建自动安装程序

下面针对这三个基本功能进行实现

一、C#开发windows服务

Windows服务在VS以前的版本中叫NT服务,在VS.NET启用了新的名称。用C#创建windows服务不是一件困难的事,下页针对服务创建、启动、停止做详细介绍

1、首先在vs中添加一winform程序KillService

2、在解决方案添加新项中添加Windows服务

3、打开服务页面,切换至代码页面有两个方法如下:

复制代码 代码如下:

protected override void OnStart(string[] args)
{
   // TODO: 在此处添加代码以启动服务。
}
protected override void OnStop()
{
// TODO: 在此处添加代码以执行停止服务所需的关闭操作。
}

当服务启动之后一般会要求每隔几秒或者几分钟刷新一次数据,所以要用到一个定时器,在定时器里边进行业务操作。windows服务不能直接在VS下进行调试,所以可以选择使用日志形式记录服务的各种启动停止或者异常的状态。具体实现代码如下:

复制代码 代码如下:

partial class Service1 : ServiceBase
    {
        static System.Timers.Timer oTimer_Get = new System.Timers.Timer();
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            // TODO: 在此处添加代码以启动服务。
            AutoLog = false;
            FileLog.Success("服务已启动");
            oTimer_Get.Enabled = true;
            oTimer_Get.Interval = 10000;
            oTimer_Get.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);
        }
        private void OnTimedEvent(object sender, System.Timers.ElapsedEventArgs e)
        {
            FileLog.Success("开始发送");
            oTimer_Get.Enabled = false;
            try
            {
                //此处可进行编写详细的业务操作
            }
            catch (Exception ex)
            {
                FileLog.Error(ex.Source + "。" + ex.Message);
            }
            oTimer_Get.Enabled = true;
            FileLog.Success("结束发送");
        }
        protected override void OnStop()
        {
            // TODO: 在此处添加代码以执行停止服务所需的关闭操作。
            FileLog.Success("服务已停止");
            oTimer_Get.Enabled = false;
        }
    }

文件记录类代码

复制代码 代码如下:

/// <summary>
    /// 文件型日志记录
    /// </summary>
    public static class FileLog
    {
        private static string sFilePath = System.Configuration.ConfigurationSettings.AppSettings["UserLog"];
        /// <summary>
        /// 错误日志
        /// </summary>
        /// <param name="Message">错误内容</param>
        public static void Error(string Message)
        {
            try
            {
                if (!Directory.Exists(sFilePath))
                {
                    Directory.CreateDirectory(sFilePath);
                }
                string sFileName = sFilePath + "\\" + string.Format("{0}-Error.txt", DateTime.Now.ToString("yyyy-MM-dd"));
                string sContent = string.Format("{0}-- {1}\r\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Message);
                FileStream fs = new FileStream(sFileName, FileMode.Append);
                Byte[] b = Encoding.Default.GetBytes(sContent);
                fs.Write(b, 0, b.Length);
                fs.Close();
            }
            catch { }
        }
        /// <summary>
        /// 正确日志
        /// </summary>
        /// <param name="Message">正确内容</param>
        public static void Success(string Message)
        {
            try
            {
                if (!Directory.Exists(sFilePath))
                {
                    Directory.CreateDirectory(sFilePath);
                }
                string sFileName = sFilePath + "\\" + string.Format("{0}-Success.txt", DateTime.Now.ToString("yyyy-MM-dd"));
                string sContent = string.Format("{0}-- {1}\r\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Message);
                FileStream fs = new FileStream(sFileName, FileMode.Append);
                Byte[] b = Encoding.Default.GetBytes(sContent);
                fs.Write(b, 0, b.Length);
                fs.Close();
            }
            catch { }
        }
    }

4、服务需要一个启动入口,打开program.cs文件在main函数里边编写入口代码如下:

复制代码 代码如下:

static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] {
              new Service1()
            };
            ServiceBase.Run(ServicesToRun);
        }
    }

到此windows服务编写完成,但是现在该服务没有什么的业务操作功能。接下来实现禁止本机QQ程序运行功能

二、禁止QQ等程序运行

只需获取本机所有运行的进行,通过Process.kill()方法结束该进程即可

复制代码 代码如下:

Process[] process = Process.GetProcesses();
                for (int i = 0; i < process.Length; i++)
                {
                    if (process[i].ProcessName == "QQ")
                    {
                        process[i].Kill();
                    }
                }

将该操作放至windows服务中的业务操作模块即可。

三、为windows服务创建自动安装程序

上面实现了windows服务基本的业务操作功能,下面为该windows服务创建自动安装程序,

1、切换至service.cs设计页面,右键选择添加安装程序

2、这时项目中就添加了一个新类 ProjectInstaller 和两个安装组件 ServiceProcessInstaller 和 ServiceInstaller,并且服务的属性值被复制到组件。

3、若要确定如何启动服务,请右键 ServiceInstaller1属性并将 StartType 属性设置为适当的值。

Manual      服务安装后,必须手动启动。Automatic    每次计算机重新启动时,服务都会自动启动。Disabled     服务无法启动。

4、将serviceProcessInstaller类的Account属性改为 LocalSystem这样,不论是以哪个用户登录的系统,服务总会启动。

这些windows服务的安装程序已经完成。通过从生成菜单中选择生成来生成项目。

注意   不要通过按 F5 键来运行项目——不能以这种方式运行服务项目。

5、创建启动和停止文件

安装文件Install.bat实现如下:

cd %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe KillService.exe

Net Start 自动查杀服务
sc config 自动查杀服务 start= auto 

KillService.exe是你生成的可执行文件的路径

自动查杀服务是windows服务的名称

停止文件Uninstall.bat文件的实现如下:

%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u KillService.exe

KillService.exe是你生成的可执行文件的路径

PS:当这两个文件保存成功之后,执行时一定要“以管理员身份运行”,否则服务启动出错

如果服务安装成功,可以在资源管理器中的服务查看到正在运行的自动查杀服务。

至此整个实例基本完成

相关文章

  • C#中窗体重复创建问题的解决方法

    C#中窗体重复创建问题的解决方法

    在C#Windows窗体应用中,我们经常遇到这样的问题,当我们触发一个窗口命令时,我连续点击其中一个命令,会出现多个同样的窗口,但我们是不管点击多少次,都只出现一次,所以本文给大家介绍了C#中窗体重复创建问题的解决方法,需要的朋友可以参考下
    2024-04-04
  • 基于C#实现压缩和解压文件及文件夹

    基于C#实现压缩和解压文件及文件夹

    这篇文章主要为大家详细介绍了基于C#实现压缩和解压文件及文件夹的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • C# CultureInfo类案例详解

    C# CultureInfo类案例详解

    这篇文章主要介绍了C# CultureInfo类案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C#实现Oracle批量写入数据的方法详解

    C#实现Oracle批量写入数据的方法详解

    往数据库批量写入数据,这个功能使用频率相对还是比较高的,特别是在做一些导入等功能的时候。本文为大家介绍了C#实现Oracle批量写入数据的方法,需要的可以参考一下
    2022-11-11
  • C#实现数据包加密与解密实例详解

    C#实现数据包加密与解密实例详解

    这篇文章主要介绍了C#实现数据包加密与解密的方法,是一项很实用的技能,需要的朋友可以参考下
    2014-07-07
  • C# 定时器保活机制引起的内存泄露问题解决

    C# 定时器保活机制引起的内存泄露问题解决

    这篇文章主要介绍了C# 定时器保活机制引起的内存泄露问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C#实现简易的计算器

    C#实现简易的计算器

    这篇文章主要为大家详细介绍了C#实现简易的计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • 基于WPF编写一个串口转UDP工具

    基于WPF编写一个串口转UDP工具

    串口是设备和上位机通信的常用接口,UDP则是网络通信常用的通信协议,串口和UDP之间的相互转换是非常有意义的。本文就利用WPF编写一个串口转UDP工具,需要的可以参考一下
    2023-04-04
  • 将数组中指定数量的元素移动数组后面的实现代码

    将数组中指定数量的元素移动数组后面的实现代码

    本篇文章是对将数组中指定数量的元素移动数组后面的实现代码进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Unity3D选择本地图片并加载

    Unity3D选择本地图片并加载

    这篇文章主要为大家详细介绍了Unity3D选择本地图片并加载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07

最新评论