• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#版Windows服务安装卸载小工具

C#版Windows服务安装卸载小工具

作者:韩天伟 字体:[增加 减小] 来源:互联网 时间:2017-05-28

韩天伟 通过本文主要向大家介绍了c#windowsform,c#编写windows服务,c#创建windows服务,c#写windows服务,c#windows窗体设计等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

前言
 在我们的工作中,经常遇到Windows服务的安装和卸载,在之前公司也普写过一个WinForm程序选择安装路径,这次再来个小巧灵活的控制台程序,不用再选择,只需放到需要安装服务的目录中运行就可以实现安装或卸载。 

开发思路
1、由于系统的权限限制,在运行程序时需要以管理员身份运行
2、因为需要实现安装和卸载两个功能,在程序运行时提示本次操作是安装还是卸载  需要输入 1 或 2 
3、接下来程序会查找当前目录中的可执行文件并过滤程序本身和有时我们复制进来的带有vhost的文件,并列出列表让操作者选择(一般情况下只有一个)
4、根据用户所选进行安装或卸载操作
5、由于可能重复操作,需要递归调用一下
具体实现
首先们要操作服务,需要用  System.ServiceProcess 来封装实现类 

using System;
using System.Collections;
using System.Configuration.Install;
using System.Linq;
using System.ServiceProcess;

namespace AutoInstallUtil
{
  public class SystemServices
  {
    /// <summary>
    /// 打开系统服务
    /// </summary>
    /// <param name="serviceName">系统服务名称</param>
    /// <returns></returns>
    public static bool SystemServiceOpen(string serviceName)
    {
      try
      {
        using (var control = new ServiceController(serviceName))
        {
          if (control.Status != ServiceControllerStatus.Running)
          {
            control.Start();
          }
        }
        return true;
      }
      catch
      {
        return false;
      }
    }


    /// <summary>
    /// 关闭系统服务
    /// </summary>
    /// <param name="serviceName">系统服务名称</param>
    /// <returns></returns>
    public static bool SystemServiceClose(string serviceName)
    {
      try
      {
        using (var control = new ServiceController(serviceName))
        {

          if (control.Status == ServiceControllerStatus.Running)
          {
            control.Stop();
          }
        }
        return true;
      }
      catch
      {
        return false;
      }
    }

    /// <summary>
    /// 重启系统服务
    /// </summary>
    /// <param name="serviceName">系统服务名称</param>
    /// <returns></returns>
    public static bool SystemServiceReStart(string serviceName)
    {
      try
      {
        using (var control = new ServiceController(serviceName))
        {
          if (control.Status == System.ServiceProcess.ServiceControllerStatus.Running)
          {
            control.Continue();
          }
        }
        return true;
      }
      catch
      {
        return false;
      }
    }

    /// <summary>
    /// 返回服务状态
    /// </summary>
    /// <param name="serviceName">系统服务名称</param>
    /// <returns>1:服务未运行 2:服务正在启动 3:服务正在停止 4:服务正在运行 5:服务即将继续 6:服务即将暂停 7:服务已暂停 0:未知状态</returns>
    public static int GetSystemServiceStatus(string serviceName)
    {
      try
      {
        using (var control = new ServiceController(serviceName))
        {
          return (int)control.Status;
        }
      }
      catch
      {
        return 0;
      }
    }

    /// <summary>
    /// 返回服务状态
    /// </summary>
    /// <param name="serviceName">系统服务名称</param>
    /// <returns>1:服务未运行 2:服务正在启动 3:服务正在停止 4:服务正在运行 5:服务即将继续 6:服务即将暂停 7:服务已暂停 0:未知状态</returns>
    public static string GetSystemServiceStatusString(string serviceName)
    {
      try
      {
        using (var control = new ServiceController(serviceName))
        {
          var status = string.Empty;
          switch ((int)control.Status)
          {
            case 1:
              status = "服务未运行";
              break;
            case 2:
              status = "服务正在启动";
              break;
            case 3:
              status = "服务正在停止";
              break;
            case 4:
              status = "服务正在运行";
              break;
            case 5:
              status = "服务即将继续";
              break;
            case 6:
              status = "服务即将暂停";
              break;
            case 7:
              status = "服务已暂停";
              break;
            case 0:
              status = "未知状态";
              break;
          }
          return status;
        }
      }
      catch
      {
        return "未知状态";
      }
    }

    /// <summary>
    /// 安装服务
    /// </summary>
    /// <param name="stateSaver"></param>
    /// <param name="filepath"></param>
    public static void InstallService(IDictionary stateSaver, string filepath)
    {
      try
      {
        var myAssemblyInstaller = new AssemblyInstaller
        {
          UseNewContext = true,
          Path = filepath
        };
        myAssemblyInstaller.Install(stateSaver);
        myAssemblyInstaller.Commit(stateSaver);
        myAssemblyInstaller.Dispose();
      }
      catch (Exception ex)
      {
        throw new Exception("installServiceError/n" + ex.Message);
      }
    }

    public static bool ServiceIsExisted(string serviceName)
    {
      ServiceController[] services = ServiceController.GetServices();
      return services.Any(s => s.ServiceName == serviceName);
    }

    /// <summary>
    /// 卸载服务
    /// </summary>
    /// <param name="filepath">路径和文件名</param>
    public static void UnInstallService(string filepath)
    {
      try
      {
        //UnInstall Service 
        var myAssemblyInstaller = new AssemblyInstaller
        {
          UseNewContext = true,
          Path = filepath
        };
        myAssemblyInstaller.Uninstall(null);
        myAssemblyInstaller.Dispose();
      }
      catch (Exception ex)
      {
        throw new Exception("unInstallServiceError/n" + ex.Message);
      }
    }
  }
} 
</div>

接下来我们封装控制台的操作方法为了实现循环监听这里用了递归 

using System;
using System.Diagnostics;
using System.IO;
using System.Linq;

namespace AutoInstallUtil
{
  class Program
  {
    static void Main(string[] args)
    {
      try
      {
        ServerAction();
      }
      catch (Exception ex)
      {
        Console.WriteLine("发生错误:{0}", ex.Message);
      }

      Console.ReadKey();
    }

    /// <summary>
    /// 操作
    /// </summary>
    private static void ServerAction()
    {
      Console.WriteLine("请输入:1安装 2卸载");
      var condition = Console.ReadLine();
      var currentPath = Environment.CurrentDirectory;
      var currentFileNameVshost = Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName).ToLower();
      var currentFileName = currentFileNameVshost.Replace(".vshost.exe", ".exe");
      var files =
        Directory.GetFiles(currentPath)
          .Select(o => Path.GetFileName(o).ToLower())
          .ToList()
          .Where(
            o =>
              o != currentFileNameVshost
              && o != currentFileName
              && o.ToLower().EndsWith(".exe")
              && o != "installutil.exe"
              && !o.ToLower().EndsWith(".vshost.exe"))
          .ToList();
      if (files.Count == 0)
      {
        Console.WriteLine("未找到可执行文件,请确认当前目录有需要安装的服务程序");
      }
      else
      {
        Console.WriteLine("找到目录有如下可执行文件,请选择需要安装或卸载的文件序号:");
      }
      int i = 0;
      foreach (var file in files)
      {
        Console.WriteLine("



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#版Windows服务安装卸载小工具
  • C#实现windows form拷贝内容到剪贴板的方法
  • C#操作windows注册表的方法
  • C#实现windows form限制文本框输入的方法
  • C#实现windows form倒计时的方法
  • C#创建windows系统用户的方法
  • C#检查Windows是否安装了某个服务的方法
  • 基于C#实现Windows服务状态启动和停止服务的方法
  • c#创建windows服务入门教程实例
  • c# 在windows服务中 使用定时器实例代码

相关文章

  • 2017-05-28C#控制图像旋转和翻转的方法
  • 2017-05-28C#实现WinForm捕获最小化事件的方法
  • 2017-05-28C#判断一个类是否实现了某个接口3种实现方法
  • 2017-05-28c# 引用类型构造器
  • 2017-05-28C# yield在WCF中的错误用法(一)
  • 2017-05-28浅谈C#设计模式之开放封闭原则
  • 2017-05-28深入Resource实现多语言支持的应用详解
  • 2017-05-28C# 骑士飞行棋的源码(分享)
  • 2017-05-28C#创建数据库及导入sql脚本的方法
  • 2017-05-28C#画笔Pen用法实例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#实现洗牌算法
    • C#实现冒泡排序算法的代码示例
    • C# 位运算符整理
    • C#中数组Array,ArrayList,泛型List详细对比
    • C#中的try catch finally用法分析
    • C#实现控制Windows系统关机、重启和注销的方法
    • C#实现系统托盘通知的方法
    • 深入理解C# DateTime日期格式化
    • C#实现word文件下载的代码
    • FileShare枚举的使用小结(文件读写锁)

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有