第十三篇 一个安装、管理windows服务的桌面程序

在网上看到一个修改程序入口的程序去把windows 服务修改成控制台的程序,然后利用控制台的程序把服务安装和管理,也想起自己原来也写了一个对windows 报务管理的程序,不过是winform的。

界面如下(自己使用,界面比较丑陋):

首先需要添加一个帮助类:

代码如下:

class Windows

{

/// <summary>

/// 检查服务存在的存在性

/// </summary>

/// <param
name=" NameService "> 服务名 </param>

/// <returns> 存在返回
true,否则返回 false; </returns>

public static bool isServiceIsExisted( string NameService)

{

ServiceController [] services = ServiceController.GetServices ();

foreach (ServiceController s in services )

{

if (s.ServiceName.ToLower () == NameService.ToLower ())

{

return true ;

}

}

return false ;

}

/// <summary>

/// 安装Windows服务

/// </summary>

/// <param
name="stateSaver"> 集合,当传递给 Install 方法时,stateSaver 参数指定的 IDictionary 应为空。</param>

/// <param
name="filepath"> 程序文件路径 </param>

public static void InstallmyService( IDictionary stateSaver, string filepath)

{

try

{

AssemblyInstaller AssemblyInstaller1 = new AssemblyInstaller ();

AssemblyInstaller1.UseNewContext = true ;

AssemblyInstaller1.Path = filepath;

stateSaver.Clear();

AssemblyInstaller1.Install(stateSaver );

AssemblyInstaller1.Commit(stateSaver );

AssemblyInstaller1.Dispose();

}

catch (Exception exp )

{

MessageBox .Show(exp.Message.ToString ());

}

}

/// <summary>

/// 卸载Windows服务

/// </summary>

/// <param
name="filepath"> 程序文件路径 </param>

public static void UnInstallmyService( IDictionary stateSaver, string filepath)

{

try

{

AssemblyInstaller AssemblyInstaller1 = new AssemblyInstaller ();

AssemblyInstaller1.UseNewContext = true ;

AssemblyInstaller1.Path = filepath;

AssemblyInstaller1.Uninstall(stateSaver );

AssemblyInstaller1.Dispose();

}

catch (Exception exp )

{

MessageBox .Show(exp.Message.ToString ());

}

}

/// <summary>

/// 检查Windows服务是否在运行

/// </summary>

/// <param
name="name"> 程序的服务名 </param>

public static bool IsRunning( string name)

{

bool IsRun = false ;

try

{

if (!isServiceIsExisted( name))

{

return false ;

}

ServiceController sc = new ServiceController (name);

if (sc.Status == ServiceControllerStatus.StartPending ||

sc.Status == ServiceControllerStatus .Running)

{

IsRun = true ;

}

sc.Close();

}

catch

{

IsRun = false ;

}

return IsRun;

}

/// <summary>

/// 启动Windows服务

/// </summary>

/// <param
name="name"> 程序的服务名 </param>

/// <returns> 启动成功返回
true,否则返回 false; </returns>

public static bool StarmyService( string name)

{

ServiceController sc = new ServiceController (name);

if (sc.Status == ServiceControllerStatus.Stopped || sc.Status == ServiceControllerStatus .StopPending)

{

sc.Start();

//sc.WaitForStatus(ServiceControllerStatus.Running,
new TimeSpan(0, 3, 0));//等待3min

}

sc.Close();

return true ;

}

/// <summary>

/// 停止Windows服务

/// </summary>

/// <param
name="name"> 程序的服务名 </param>

/// <returns> 停止成功返回
true,否则返回 false; </returns>

public static bool StopmyService( string name)

{

ServiceController sc = new ServiceController (name);

if (sc.Status == ServiceControllerStatus.Running ||

sc.Status == ServiceControllerStatus .StartPending )

{

try

{

sc.Stop();

sc.WaitForStatus( ServiceControllerStatus.Stopped , new TimeSpan (0, 0 , 10));

}

catch (Exception exp )

{

MessageBox .Show(exp.Message.ToString ());

}

}

sc.Close();

return true ;

}

/// <summary>

/// 重启Windows服务

/// </summary>

/// <param
name="name"> 程序的服务名 </param>

/// <returns> 重启成功返回
true,否则返回 false; </returns>

public static bool RefreshmyService( string name)

{

return StopmyService( name) && StarmyService( name);

}

}

下面只需要在按钮事件下面写入不同的代码就行了:

//安装服务

private void btnInstall_Click (object sender , EventArgs e )

{

try

{

IDictionary dictionary = new Hashtable ();

Windows .InstallmyService(dictionary , ServerPath);

if (Windows .isServiceIsExisted (ServerName))

{

this .label1.Text = "服务已经安装。。" ;

this .btnInstall.Enabled = false ;

this .btnUnInstall.Enabled = true ;

this .btnStart.Enabled = true ;

this .btnStop.Enabled = false ;

MessageBox .Show( "服务安装成功!" );

}

}

catch (Exception exp )

{

this .label1.Text = "服务安装失败。。" ;

MessageBox .Show( "服务安装失败,ErrorCode:" + exp.Message );

}

}

//卸载服务

private void btnUnInstall_Click (object sender , EventArgs e )

{

try

{

IDictionary dictionary = new Hashtable ();

Windows .UnInstallmyService(dictionary , ServerPath);

if (! Windows.isServiceIsExisted (ServerName))

{

this .label1.Text = "服务已经卸载。。" ;

this .btnInstall.Enabled = true ;

this .btnUnInstall.Enabled = false ;

this .btnStart.Enabled = false ;

this .btnStop.Enabled = false ;

MessageBox .Show( "服务卸载成功!" );

}

}

catch (Exception exp )

{

this .label1.Text = "服务卸载失败。。" ;

MessageBox .Show( "服务卸载失败,ErrorCode:" + exp.Message );

}

}

//启动服务

private void btnStart_Click (object sender , EventArgs e )

{

try

{

if (Windows .StarmyService (ServerName))

{

this .label1.Text = "服务启动中。。" ;

if (Windows .IsRunning( ServerName))

{

this .label1.Text = "服务正在运行。。" ;

this .btnInstall.Enabled = false ;

this .btnUnInstall.Enabled = false ;

this .btnStart.Enabled = false ;

this .btnStop.Enabled = true ;

}

}

}

catch (Exception exp )

{

this .label1.Text = "服务启动失败。。" ;

MessageBox .Show( "服务启动失败,ErrorCode:" + exp.Message );

}

}

//停止服务

private void btnStop_Click (object sender , EventArgs e )

{

try

{

if (Windows .StopmyService (ServerName))

{

this .label1.Text = "服务停止中。。" ;

if (! Windows.IsRunning (ServerName))

{

this .label1.Text = "服务已停止。。" ;

this .btnInstall.Enabled = false ;

this .btnUnInstall.Enabled = true ;

this .btnStart.Enabled = true ;

this .btnStop.Enabled = false ;

}

}

}

catch (Exception exp )

{

this .label1.Text = "服务停止失败。。" ;

MessageBox .Show( "服务停止失败,ErrorCode:" + exp.Message );

}

}

private void InstallServices_Load (object sender , EventArgs e )

{

ServiceController [] services = ServiceController.GetServices ();  //加载时候把系统的服务列表加载进来

foreach (var serviceController in services )

{

this .cmbServiceList.Items.Add(serviceController.ServiceName );

}

}

至此所有的功能基本上都完成了,能够对你选择的服务进行安装和卸载了,其它两个按钮的事件读者可以自己加

Demo下载:http://pan.baidu.com/s/1dDq2i2H

时间: 2024-10-01 04:53:42

第十三篇 一个安装、管理windows服务的桌面程序的相关文章

【先定一个小目标】Redis 安装成windows服务-开机自启

1.第一步安装成windows服务的,开机自启动 redis-server --service-install redis.windows.conf 2.启动\关闭 redis-server --service-start redis-server --service-stop 3.可安装多个实例 redis-server --service-install –service-name redisService1 –port 10001 redis-server --service-start

将 tomcat 安装成 windows 服务

1.下载 tomcat 的windows 压缩包,一般以 .zip ,而且文件名中有 bin 的文件就是 2.解压下载的文件到某一个目录下,eg: TOMCAT_HOME 3.打开 cmd ,运行 %TOMCAT_HOME%/bin/service.bat install 即可将 tomcat 安装成为 windows 服务 4.服务管理窗口(开始 -> 运行 -> cmd ->  services.msc ),找到 apache tomcat 服务(可以在 service.bat 中重

将MongoDB安装为Windows服务---安装MongoDB服务

MongoDB是目前非常流行的一种NoSQL数据库,其灵活的存储方式备受开发人员青睐.本文就介绍一下如何安装并设置成Windows服务的方法.目前为止,我们每次启动MongoDB数据库服务都需要通过CMD输入指令mongod来开启服务,较为麻烦,所以本节介绍下如何将将mongo安装为Windows服务 配置完毕后的启动方式: Win+R 输入 services.msc找到Mongo_Service(这是上面 --serviceName 你填写的服务名称),然后属性,点击启动,然后就好了. 注意:

利用Python脚本管理Windows服务

Windows服务常用的功能就是启动服务,关闭服务,重启服务和查询服务运行状态,其中查询服务运行状态是其他三种操作的基础. 本文中提到的使用Python脚本管理Windows服务实际上是调用win32serviceutil模块,此模块来自pywin32包,此模块本身有管理服务的功能,有兴趣的可以去阅读它的部分源码. 本脚本存在的目的是为了熟练Python的语法和基本操作,Windows下有更好的命令行工具来管理服务,如sc.Powershell等.通常命令行工具的执行速度要比services.m

用 nssm 把 Nginx 安装成 Windows 服务方法

总之:用 nssm 比 srvany.exe 简便多了. 1. 下载nginx windows版本:http://nginx.org/ 2. 下载 nssm :http://nssm.cc/ 3. 安装Nginx下载解压到一个目录,nssm下载后解压相应版本(32/64)到一个目录.然后安装服务:nssm install N1 "D:\N1\nginx.exe" 即可安装成功最基本的服务,不过启动的是nssm,让后由nssm启动nginx. 现在就可以通过控制面板->管理员工具-

如何使用Topshelf管理Windows服务

一.官方网站及源码下载 1.官方网站:http://topshelf-project.com/ 2.源码下载:https://github.com/Topshelf/Topshelf/downloads 二.使用Topshelf创建服务 1 static void Main(string[] args) 2 { 3 HostFactory.Run(x => 4 { 5 x.Service<MyService>(dtService => 6 { 7 ServiceConfigurat

如何使用PowerShell管理Windows服务

[TechTarget中国原创] 作为一名系统管理员,最常见的任务之一就是学会管理Windows服务,这是保证Windows服务器和客户端正常运行的重要内容. 许多操作系统和应用程序都依赖于这些服务. Microsoft Management Console窗口是我们非常熟悉的一款Windows服务,通过该服务,管理员可以在本地或者远程计算机上操控服务.但是,一时间还不能改变几十台甚至几百台机器. 此时,PowerShell就派上用场了. PowerShell应用几个本地Cmdlet来管理Win

使用srvany.exe将程序安装成windows服务的详细教程

srvany.exe介绍 srvany.exe是Microsoft Windows Resource Kits工具集的一个实用的小工具,用于将任何EXE程序作为Windows服务运行.也就是说srvany只是其注册程序的服务外壳,这个特性对于我们 来说非常实用,我们可以通过它让我们的程序以SYSTEM账户启动,或者实现随机器启动而自启动,也可以隐藏不必要的窗口,比如说控制台窗口等等. 资源下载 你可以通过下载并安装Microsoft Windows Resource Kits 获得或者直接在本文

使用instsrv.exe+srvany.exe将应用程序安装为windows服务[转]

转自:http://qingmu.blog.51cto.com/4571483/1248649 一.什么是instsrv.exe和srvany.exe instsrv.exe.exe和srvany.exe是Microsoft Windows Resource Kits工具集中 的两个实用工具,这两个工具配合使用可以将任何的exe应用程序作为window服务运行.srany.exe是注册程序的服务外壳,可以通过它让应用程序以system账号启动,可以使应用程序作为windows的服务随机器启动而自