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

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 = ;
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, , 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, , 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 = ; 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:当这两个文件保存成功之后,执行时一定要“以管理员身份运行”,否则服务启动出错

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

至此整个实例基本完成

本实例主要是为了学习Windows服务的开发,启动,停止。具体业务功能根据需求进行调整,比如定时从webservice接口中获取新添加的数据等需求

C#开发Windows服务 附简单实例实现禁止QQ运行的更多相关文章

  1. C#开发Windows服务详细流程

    1.Windows服务简单介绍 Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序,主要用于长时间运行的功能或者执行定时任务.一般情况下,用户不能通过用户界面来安装和启 ...

  2. 使用C#开发windows服务定时发消息到钉钉群_群组简单消息

    前言:本提醒服务,是由C#语言开发的,主要由windows服务项目和winform项目组成,运行服务可实现功能:向钉钉自定义机器人群组里,定时,定次,推送多个自定义消息内容,并实现主要功能的日志记录. ...

  3. 使用Visual Studio 2015 Community 开发windows服务

    昨天研究在.NET下开发Windows服务程序,期间遇到一些小问题,这里仅将自己的开发过程和需要注意的地方写下和广大网友分享……  1.基础   Windows服务是指系统启动时能够自己运行的程序.W ...

  4. C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库

    C# DateTime的11种构造函数   别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...

  5. android Jni NDK开发环境搭建及其简单实例的编写

    android  Jni  NDK开发环境搭建及其简单实例的编写 由于工作需要,需要采用开发想要的JNI,由于之前没有接触过安卓的开发,所以更加网上的帖子,学习了下.遇到了些问题,然后总结下学习过程中 ...

  6. c#金额转换成中文大写金额 .Net开发Windows服务

    c#金额转换成中文大写金额   2018-08-24 转别人 c#金额转换成中文大写金额 /// <summary> /// 金额转换成中文大写金额 /// </summary> ...

  7. C#开发windows服务如何调试——资料整理

    原文标题:C# Windows服务程序如何进行调试 原文地址:https://jingyan.baidu.com/article/456c463b18e1b00a583144b3.html 第一种: ...

  8. c#创建windows服务入门教程实例

    用c#中创建一个windows服务非常简单,与windows服务相关的类都在System.ServiceProcess命名空间下. 每个服务都需要继承自ServiceBase类,并重写相应的启动.暂停 ...

  9. VS2013开发Windows服务项目

    这篇随笔里,我将介绍如何用VS2013开发Windows服务项目,实现的功能是定时发送电子邮件. 开发环境:VS2013,SQL Server2008,采用C#语言开发 步骤一:创建Windows服务 ...

随机推荐

  1. Python的平凡之路(6)

    一.面向对象编程介绍 1 编程范式:          编程范式(Programming Paradigm)是某种编程语言典型的编程风格或者说是编程方式.随着编程方法学和软件工程研究的深入,特别是OO ...

  2. IIS 工作原理之非托管代码旅程(一)

    IIS6改变 IIS6可以为每个不同的虚拟目录创建不同的程序池,这样缩小了IIS的Application Pool的颗粒度,不同的虚拟目录之间是互不影响的. IIS6(和IIS7经典模式)与IIS7集 ...

  3. 怎样禁用或启用"最近使用的项目"

    1.右击“任务栏”——属性——‘开始’菜单——自定义——高级——去掉“列出我最近打开的文档”的勾选——确定.2.通过“组策略”来修改开始——运行——gpedit.msc——用户配置——管理模板——任务 ...

  4. Qt控件篇 ---- QTableView/QTableWidget

    记录 //按字母排序 item->setText("2"); //按数值排序item->setData(Qt::DisplayRole, 2);

  5. 为python-sproto添加map支持

    上个月太忙了,做完这个修改还没写博客,现在补一下.. 之前使用protobuf做协议打包的时候,经常会有个痛点,没法用具体数据的值作为key来索引数据.比如现在客户端上传了造兵协议,协议大概长这样: ...

  6. springboot系列之-log

    配置文件以application.yml为例说明: Spring Boot默认的日志组件为Logback. 一. 日志配置参数: logging: file: #日志文件,绝对路径或相对路径 path ...

  7. Neo4j 两种索引Legacy Index与Schema Index区别

    Legacy Indexes 在Neo4j 2.0版本之前,Legacy index被称作indexes.这个索引是通过外部图存储在外的Lucene实现,允许“节点”和“联系”以key:value键值 ...

  8. Windows 托盘区域显示图标

    NOTIFYICONDATA structure 这个结构体包含了向通知区域(底部任务栏右下角区域,下面都称为托盘)显示的信息.需要使用函数Shell_NotifyIcon. 结构体成员 typede ...

  9. LintCode First Bad Version

    找出第一个出问题的version. /** * public class SVNRepo { * public static boolean isBadVersion(int k); * } * yo ...

  10. Notepad++配置Python开发环境

    1. 安装Python 1 下载 我选择了32位的2.7版本.https://www.python.org/ftp/python/2.7.8/python-2.7.8.msi 2. 安装 安装的时候可 ...