在网上看到一个修改程序入口的程序去把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