C#.NET 操作Windows服务(安装、卸载)
注意点:
1.安装时要请求到管理员权限。
2.卸载前,一定要停止掉Windows服务,否则需要重启或注销电脑。代码无法停止服务时,使用services.msc来停止。
开始:
1。新建一个名为“Windows服务操作”的WINFORM程序。
2。在解决方案里添加一个Windows服务项目,名为“ADemoWinSvc”。

3。双击“Service1.cs”,右键,添加安装程序。
4。双击“ProjectInstaller.cs”,修改“serviceProcessInstaller1”中的“Account”为“LocalSystem”.
5。修改“serviceInstaller1”,"Description"设置为“这是一个demo windows服务”,ServiceName 设置为“ADemoWinSvc”,StartType 设置为“Automatic”。
6。修改“Service1.cs”的代码,增加服务启动日志和停止日志。
using CommonUtils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text; namespace ADemoWinSvc
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
} protected override void OnStart(string[] args)
{
GLog.WLog("服务已启动");
} protected override void OnStop()
{
GLog.WLog("服务已停止");
}
}
}
工具类:
using System;
using System.IO; namespace CommonUtils
{ public static class GLog
{
static object _lockObj = new object(); public static void WLog(string content)
{
lock (_lockObj)
{
string curPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName);
string logDir = "Logs";
string logDirFullName = Path.Combine(curPath, logDir); try
{
if (!Directory.Exists(logDirFullName))
Directory.CreateDirectory(logDirFullName);
}
catch { return; } string fileName = "Logs" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
string logFullName = Path.Combine(logDirFullName, fileName); try
{
using (FileStream fs = new FileStream(logFullName, FileMode.Append, FileAccess.Write))
using (StreamWriter sw = new StreamWriter(fs))
sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " " + content);
}
catch { return; } }
}
}
}
7。回到winform程序,在“Form1.cs”上添加“安装”和“卸载”2个按钮。
代码如下:
using CommonUtils;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace Windows服务操作
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{ } /// <summary>
/// windows服务名
/// </summary>
static string _winSvcName = "ADemoWinSvc"; /// <summary>
/// windows服务对应的exe 名
/// </summary>
static string _winSvcExeName = "ADemoWinSvc.exe"; private void btnSetup_Click(object sender, EventArgs e)
{
try
{
//是否存在服务
if (ServiceUtil.ServiceIsExisted(_winSvcName))
{
//已存在,检查是否启动
if (ServiceUtil.IsRun(_winSvcName))
{
//服务是已启动状态
lblMsg.Text = "[001]服务是已启动状态";
}
else
{
//未启动,则启动
ServiceUtil.StarService(_winSvcName);
lblMsg.Text = "[002]服务是已启动状态";
}
}
else
{
//不存在,则安装
IDictionary mySavedState = new Hashtable();
string curPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName);
string apppath = Path.Combine(curPath, _winSvcExeName);
ServiceUtil.InstallService(mySavedState, apppath); lblMsg.Text = "[003]服务是已启动状态"; //安装后并不会自动启动。需要启动这个服务
ServiceUtil.StarService(_winSvcName); lblMsg.Text = "[004]服务是已启动状态";
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} private void btnUninstall_Click(object sender, EventArgs e)
{
//** 卸载服务最重要的是先停止,否则电脑需要重启或注销 **
try
{
//是否存在服务
if (!ServiceUtil.ServiceIsExisted(_winSvcName))
{
MessageBox.Show("服务不存在,不需要卸载");
return;
} //如果服务正在运行,停止它
if (ServiceUtil.IsRun(_winSvcName))
{
ServiceUtil.StopService(_winSvcName);
}
//再检查一次是否在运行
if (ServiceUtil.IsRun(_winSvcName))
{
MessageBox.Show("服务无法停止,请手动停止这个服务");
return;
}
//卸载
ServiceUtil.UnInstallServiceByName(_winSvcName); lblMsg.Text = "[005]服务已卸载"; }
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
使用到的工具类:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration.Install;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text; namespace CommonUtils
{
/// <summary>
/// windows服务操作工具类
/// </summary>
public static class ServiceUtil
{
/// <summary>
/// 服务是否正在运行
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static bool IsRun(string name)
{
bool IsRun = false;
try
{
if (!ServiceIsExisted(name)) return false;
var sc = new ServiceController(name);
if (sc.Status == ServiceControllerStatus.StartPending || sc.Status == ServiceControllerStatus.Running)
{
IsRun = true;
}
sc.Close();
}
catch
{
IsRun = false;
}
return IsRun;
} /// <summary>
/// 启动服务
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static bool StarService(string name)
{
try
{
var sc = new ServiceController(name);
if (sc.Status == ServiceControllerStatus.Stopped || sc.Status == ServiceControllerStatus.StopPending)
{
sc.Start();
sc.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 10));
}
else
{ }
sc.Close();
return true;
}
catch (Exception ex)
{
throw ex;
}
} /// <summary>
/// 停止服务(有可能超时)
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static bool StopService(string name)
{
try
{
var sc = new ServiceController(name);
if (sc.Status == ServiceControllerStatus.Running || sc.Status == ServiceControllerStatus.StartPending)
{
sc.Stop();
//停止服务超时时间:56秒。
sc.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 56));
}
else
{ }
sc.Close();
return true;
}
catch (Exception ex)
{
throw ex;
}
} /// <summary>
/// 是否存在
/// </summary>
/// <param name="serviceName"></param>
/// <returns></returns>
public static bool ServiceIsExisted(string serviceName)
{
ServiceController[] services = ServiceController.GetServices();
foreach (ServiceController s in services)
if (s.ServiceName.ToLower() == serviceName.ToLower())
return true;
return false;
} /// <summary>
/// 安装
/// </summary>
/// <param name="stateSaver"></param>
/// <param name="filepath"></param>
public static void InstallService(IDictionary stateSaver, string filepath)
{
try
{
AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller();
myAssemblyInstaller.UseNewContext = true;
myAssemblyInstaller.Path = filepath;
myAssemblyInstaller.Install(stateSaver);
myAssemblyInstaller.Commit(stateSaver);
myAssemblyInstaller.Dispose();
}
catch (Exception ex)
{
throw ex;
}
} /// <summary>
/// 使用路径卸载(有时候不便于用路径来卸载,则使用SC DELETE 名称来卸载)
/// </summary>
/// <param name="filepath"></param>
public static void UnInstallService(string filepath)
{
try
{
AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller();
myAssemblyInstaller.UseNewContext = true;
myAssemblyInstaller.Path = filepath;
myAssemblyInstaller.Uninstall(null);
myAssemblyInstaller.Dispose();
}
catch (Exception ex)
{
throw ex;
}
} /// <summary>
/// 使用windows服务名卸载
/// </summary>
/// <param name="WinServiceName"></param>
public static void UnInstallServiceByName(string WinServiceName)
{
ProcessStartInfo pStart = new ProcessStartInfo("sc.exe");
Process pRoc = new Process(); pStart.Arguments = " delete " + WinServiceName;
pStart.UseShellExecute = false;
pStart.CreateNoWindow = false; pRoc.StartInfo = pStart;
pRoc.Start();
pRoc.WaitForExit();
} }
}
winform 程序里要引用 System.Configuration.Install、System.ServiceProcess 这2个程序集。
8。分别编译ADemoWinSvc、Windows服务操作,将ADemoWinSvc.exe 复制到Windows服务操作.exe 所在目录。

9。管理员身份运行Windows服务操作.exe,点击安装按钮,即可看到效果。



-
C#.NET 操作Windows服务(安装、卸载)的更多相关文章
- C#版Windows服务安装卸载小工具-附源码
前言 在我们的工作中,经常遇到Windows服务的安装和卸载,在之前公司也普写过一个WinForm程序选择安装路径,这次再来个小巧灵活的控制台程序,不用再选择,只需放到需要安装服务的目录中运行就可以实 ...
- windows服务安装卸载
到C盘下找到对应的开发VS的installutil.exe文件,复制到程序的执行文件(*.exe)相同目录下在开始程序中找到VS命令提示工具 转到程序的执行文件(*.exe)目录下 C:\>cd ...
- 2.Windows服务-->安装卸载服务
1.使用vs组件“VS2012开发人员命令提示” 工具,进行安装卸载服务(必须以“管理员身份运行") 安装和卸载的时候选择合适的安装程序工具地址,例如: 安装服务:C:\Windows\Mi ...
- C# 操作windows服务[启动、停止、卸载、安装]
主要宗旨:不已命令形式操作windows服务 static void Main(string[] args) { var path = @"E:\开发辅助项目\WCF\WCF.Test\WC ...
- C#操作windows服务,安装、卸载、停止、启动
public class ServiceUtil { private string _ServiceName = string.Empty; private string _AppName = str ...
- Windows服务安装与卸载
Windows服务安装与卸载,使用到了InstallUtil.exe 安装: c: cd "C:\Windows\Microsoft.NET\Framework\v4.0.30319&quo ...
- C# windows服务安装及卸载
--C# windows服务安装及卸载 保存BAT文件 执行即可 @SET FrameworkDir=%WINDIR%\Microsoft.NET\Framework@SET Framework ...
- Windows 服务安装与卸载 (通过 Sc.exe)
1. 安装 新建文本文件,重命名为 ServiceInstall.bat,将 ServiceInstall.bat 的内容替换为: sc create "Verity Platform De ...
- Windows 服务安装与卸载 (通过 installutil.exe)
1. 安装 安装 .NET Framework ; 新建文本文件,重命名为 ServiceInstall.bat,将 ServiceInstall.bat 的内容替换为: C:\\Windows\\M ...
随机推荐
- JVM:GC Roots
JVM:GC Roots 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 JVM 垃圾回收的时候如何确定垃圾 什么是垃圾 简单来说就是内存中已经不再被使用的空间就 ...
- BUAA2020软工作业——提问回顾与个人总结
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾与个人总结 我在这个课程的目标是 进一步提高自己的编码能力,工程能力 这个作业在哪个具体方 ...
- 震惊,hzoi的分差竟然折磨大,活到爆!
众所周知,hzoi的分差非常"大",那么究竟有多大呢?最近,一位外国小哥开发出了hzoi的分差竟然折磨大,活到爆!的方法,这究竟是怎么一回事呢?快和小编一起来看看吧- 竟然1分就可 ...
- 记录编译QGIS(3.4+Qt5.11+VS2015)的整个过程
编译运行整个QGIS耗时耗力,由于本人比较愚钝,来来回回花了大概两个星期最终编译成功,记录一下整个过程,一方面备忘,另一方面可能也给别人一点借鉴. 1.准备工作 参考了许多网上的教程,李民录大神的&l ...
- Spring:面向切面编程的AOP
一.前言 除了依赖注入(DI),Spring框架提供的另一个核心功能是对面向方面的编程(AOP)的支持. AOP通常被称为实现横切关注点的工具.横切关注点一词是指应用程序中的逻辑不能与应用程序的其余部 ...
- Ubuntu virtualenv 创建 python2 虚拟环境 激活 退出
首先默认安装了virtualenv 创建python2虚拟环境 your-name@node-name:~/virtual_env$ virtualenv -p /usr/bin/python2 py ...
- webRTC中语音降噪模块ANS细节详解(三)
上篇(webRTC中语音降噪模块ANS细节详解(二))讲了ANS的处理流程和语音在时域和频域的相互转换.本篇开始讲语音降噪的核心部分,首先讲噪声的初始估计以及基于估计出来的噪声算先验信噪比和后验信噪比 ...
- CSS学习笔记:浮动属性
目录 一.浮动流是什么 二.通过代码实例了解浮动特点 1. 搭建测试框架 2. 添加浮动 3. 浮动元素的排布 4. 给行内元素添加浮动效果 5. 子元素浮动后对父元素的影响 5.1 在父元素中添加o ...
- linux环境下redis安装(redis伪集群搭建)
redis在linux环境下搭建 1.创建目录 [root@192 local]# mkdir /usr/local/redis 2.下载redis,并解压 [root@192 local]# wge ...
- 手撸markdown web server
先上效果图 在线预览 powered by kingreatwill/mdserve. markdown项目:https://github.com/kingreatwill/open 目的 经常写笔记 ...