Windows服务

Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这种服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。

创建Windows服务应用程序 即创建 Windows窗体应用程序 项目

然后再项目上添加新建项

选中Windows服务文件 出现设计界面后 在界面任意位置右键  添加安装程序

出现如下安装界面

选中 serviceInstaller 按 F4 可更改服务属性

Description :服务描述

DisplayName :服务显示名称

ServiceName :服务的真实名称

StartType :服务的 启动 类型 【手动启动、自动启动、禁用】

选中 serviceProcessInstaller 按 F4 设置服务的 登录 类型

在 MyService.cs 文件中写 服务启动 和 停止 分别 执行的 代码

最后在 Program Main() 方法中 写调用服务的 代码

以上操作就可以成功编写一个 Windows服务 了

继续,我们对 Windows 服务 进行安装

仍然创建一个 Windows 窗体应用程序 对刚创建的服务 进行操作【安装 、启动 、停止 、卸载】

using System;
using System.Collections;
using System.Configuration.Install;
using System.ServiceProcess;
using System.Windows.Forms; namespace WindowsServiceInstallProgram
{
public partial class ServicePacageInstall : Form
{
public ServicePacageInstall()
{
InitializeComponent();
} string serviceProgramPath = Application.StartupPath + "\\MyService.exe";//安装服务路径
string serviceName = "ownService";//安装服务名称 非 服务显示 名称 /// <summary>
/// 安装服务
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnInstallService_Click(object sender, EventArgs e)
{
try
{
if (IsExistsService(serviceName))
{
UninstallService(serviceProgramPath);
}
InstallService(serviceProgramPath);
MessageBox.Show(
string.Format("服务【{0}】安装成功!\r\n时间:【{1}】", serviceName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")),
"Tips:", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
catch (Exception ex)
{
MessageBox.Show(
string.Format("服务【{0}】安装失败!\r\n错误信息:【{1}】", serviceName, ex.Message),
"Tips:", MessageBoxButtons.OK, MessageBoxIcon.Hand);
} } /// <summary>
/// 启动服务
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnLaunchService_Click(object sender, EventArgs e)
{
try
{
if (IsExistsService(serviceName))
{
LaunchService(serviceName);
}
MessageBox.Show(
string.Format("服务【{0}】成功启动!\r\n时间:【{1}】", serviceName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")),
"Tips:", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show(
string.Format("服务【{0}】启动失败!\r\n错误信息:【{1}】", serviceName, ex.Message),
"Tips:", MessageBoxButtons.OK, MessageBoxIcon.Hand);
}
} /// <summary>
/// 停止服务
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStopService_Click(object sender, EventArgs e)
{
try
{
if (IsExistsService(serviceName))
{
StopService(serviceName);
}
MessageBox.Show(
string.Format("服务【{0}】成功停止!\r\n时间:【{1}】", serviceName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")),
"Tips:", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show(
string.Format("服务【{0}】停止失败!\r\n错误信息:【{1}】", serviceName, ex.Message),
"Tips:", MessageBoxButtons.OK, MessageBoxIcon.Hand);
}
} /// <summary>
/// 卸载服务
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnUninstallService_Click(object sender, EventArgs e)
{
try
{
if (IsExistsService(serviceName))
{
StopService(serviceName);
UninstallService(serviceProgramPath);
MessageBox.Show(
string.Format("服务【{0}】成功卸载!\r\n时间:【{1}】", serviceName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")),
"Tips:", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show(
string.Format("服务【{0}】不存在!\r\n时间:【{1}】", serviceName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")),
"Tips:", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
MessageBox.Show(
string.Format("服务【{0}】卸载失败!\r\n错误信息:【{1}】", serviceName, ex.Message),
"Tips:", MessageBoxButtons.OK, MessageBoxIcon.Hand);
}
} #region 判断服务是否存在
private bool IsExistsService(string serviceName)
{
/* 另一种方法
得到当前计算机所有服务对象
serviceController[] serviceControllers = ServiceController.GetServices();
通过服务名【ServiceName】(非显示服务名DisplayServiceName) 得到服务对象①
ServiceController serviceController = serviceControllers.SingleOrDefault(s => s.ServiceName == serviceName);
*/
foreach (ServiceController sc in ServiceController.GetServices())
{
if (sc.ServiceName.ToUpper() == serviceName.ToUpper())
{
return true;
}
}
return false;
}
#endregion #region 安装服务
private void InstallService(string serviceProgramPath)
{
using (AssemblyInstaller installer = new AssemblyInstaller())
{
installer.UseNewContext = true;
installer.Path = serviceProgramPath;
IDictionary saveState = new Hashtable();
installer.Install(saveState);
installer.Commit(saveState);
}
}
#endregion #region 启动服务
private void LaunchService(string serviceName)
{
using (ServiceController currentService = new ServiceController(serviceName))
{
if (currentService.Status == ServiceControllerStatus.Stopped)
{
currentService.Start();
}
}
}
#endregion #region 停止服务
private void StopService(string serviceName)
{
using (ServiceController service = new ServiceController(serviceName))
{
if (service.Status == ServiceControllerStatus.Running)
{
service.Stop();
}
}
}
#endregion #region 卸载服务
private void UninstallService(string serviceProgramPath)
{
using (AssemblyInstaller installer = new AssemblyInstaller())
{
installer.UseNewContext = true;
installer.Path = this.serviceProgramPath;
installer.Uninstall(null);
}
}
#endregion
}
}

记得用管理员身份运行起来,否则会操作 失败的

未用管理员权限运行结果

管理员权限运行结果 如下

效果如下

手把手教用C#编写Windows服务 并控制服务 安装、启动、停止、卸载的更多相关文章

  1. Windows下Apache的下载安装启动停止

    一:下载 打开任意浏览器,输入网址:http://httpd.apache.org/ 进入如下界面: 我们选择最新版Apache httpd 2.4.12Released,点击Download,进入如 ...

  2. c#用控制台程序安装启动停止卸载服务

    第一步:新建控制台项目  第二步:添加服务 第三步:右键新建完成的服务项 点击 在start 和stop事件中分别写上   第四步 编写代码 双击打开 using System; using Syst ...

  3. c# windows server安装启动与卸载

    使用installutil.exe安装卸载服务时,由于需要指向服务的全路径,由于生成目录往往不是服务发布的最终目录,很不便利,下面介绍两种方式方便操作: 方式一: 项目中加入install.bat与u ...

  4. 手把手教你写一个windows服务 【基于.net】 附实用小工具{注册服务/开启服务/停止服务/删除服务}

    1,本文适用范围 语言:.net 服务类型:windows服务,隔一段时间执行 2,服务搭建: 1,在vs中创建 console程序 2,在console项目所在类库右键 添加-新建项-选择Windo ...

  5. 手把手教你如何在Windows下allure与jenkins的集成生成让你一见钟情的测试报告 - 03(非常详细,非常实用)

    简介 好了,国庆假期结束,开始搬砖.为什么要把allure和jenkins集成了?原因是集成以后,我们就可以直接查看allure的结果,不需要重复输入命令.重复使用浏览器打开文件来查看allure的结 ...

  6. 手把手教你用Abp vnext构建API接口服务

    ABP是一个开源应用程序框架,该项目是ASP.NET Boilerplate Web应用程序框架的下一代,专注于基于ASP.NET Core的Web应用程序开发,也支持开发控制台应用程序. 官方网站: ...

  7. 手把手教你掌握——性能工具Jmeter之参数化(含安装教程 )

    本节大纲 Jmeter 发送get/post请求 Jmeter 之文件参数化-TXT/Csv Jmeter之文件参数化-断言 JMeter简介 Apache JMeter是一款基于JAVA的压力测试T ...

  8. windows下oracle 11g r2 安装过程与卸载详细图解

    Oracle 11g安装 1.解压下载的包,然后进入包内,点击setup.exe开始安装 . 2.出现如下:一般把那个小对勾取消,点击下一步进行, 弹出下图这个后点‘是' 3.下图后,选择创建和配置数 ...

  9. Windows服务程序的原理及实现(服务分为WIN32服务和系统服务)

    今天给大家讲下怎样做一个服务程序...本来是想详细讲的,不过写着写着累得要命..很多 地方就没详细...不过代码我加了点注...如果还有一些不明白的自己查下MSDN......便宜 环境,,VC++6 ...

随机推荐

  1. 【SSH进阶之路】Hibernate映射——一对多关联映射(七)

    上上篇博文[SSH进阶之路]Hibernate映射——一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份 ...

  2. 【Linux开发】【CUDA开发】Ubuntu上安装NVIDIA显卡驱动

    机型为戴尔Vostro3900  显卡型号为GTX 745  对于Nvidia显卡的驱动,如今很多Linux发行版会默认使用名为nouveau的驱动程序.Nouveau是由第三方为Nvidia开发的一 ...

  3. 面试之哈希表leetcode

    1 案例1 leetcode-----242 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 示例 1: 输入: s = "anagram", t ...

  4. 谷歌浏览器调试swoole长连接方法

    谷歌浏览器调试swoole长连接方法network标签里面的ws 看frames  

  5. 面试必备的10道MySQL题

    MySQL 事务,是我们去面试中高级开发经常会被问到的问题,很多人虽然经常使用 MySQL,SQL 语句也写得很溜,但是面试的时候,被问到这些问题,总是不知从何说起.下面我们先来了解一下什么是 MyS ...

  6. Qt5 QtQuick系列----QtQuick的Secne Graph剖析(2)--自定义QML类型 (继承QQuickItem)

    "当下即永恒"  --- 佚名 Qt用户可以方便地使用QML中的Rectangle等基本类型,但是当不够用时,或,需要开发更高级的界面时,可以自己定义QML类型. 自定义QML类型 ...

  7. VMware vSphere6.0 服务器虚拟化部署安装图解(最全,最详细)-搭建的所有步骤

    VMware vSphere6.0 服务器虚拟化部署安装图解 一 .VMware vSphere部署的前期规划要点 1.vSphere的优点 (略) 2如何利用现在的设备架构虚拟化环境 在虚拟化过程中 ...

  8. 16 JQuery---JavaScript框架

    1.JQuery概念一个JavaScript框架.简化JS开发JQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScr ...

  9. CRT远程连接centos7,连接超时

    CRT远程连接centos7,连接超时 问题原因: 宿主机(win10)和虚拟机(centos7)不在同一个网段 在宿主机无法ping通虚拟机, 首先在cmd窗口ipconfig查看一下vmnet的i ...

  10. Hbase面试题

    hbase的特点 )hbase适合存储海量数据,是一个分布式的,基于列式存储的数据库,基于hadoop的hdfs存储,zookeeper进行管理. )hbase 适合存储半结构化或非结构化的数据,对于 ...