zoukankan      html  css  js  c++  java
  • c# windows server安装启动与卸载

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

    方式一:

    项目中加入install.bat与uninstall.bat文件,设置为始终复制,生成后,在debugin下双击install.bat安装启动服务,双击uninstall.bat卸载服务,需要管理员权限时右击以管理员运行。

    其中install.bat文件如下:

    @echo off 
    @title 安装windows服务
    set curdir=%~dp0 
    cd /d %curdir%
    %SystemRoot%Microsoft.NETFrameworkv4.0.30319installutil.exe 服务.exe
    echo==============================================================
    echo=
    echo         windows服务程序安装
    echo=
    echo==============================================================
    @echo off 
    net start 服务名
    pause

    其中的

    set curdir=%~dp0 
    cd /d %curdir%

    是通过获取当前bat文件所在的目录,然后cd 到该目录来解决该问题

    uninstall.bat文件如下:

    @echo off 
    @title 卸载Windows服务
    set curdir=%~dp0
    cd /d %curdir%
    %SystemRoot%Microsoft.NETFrameworkv4.0.30319installutil.exe /u 服务.exe
    echo==============================================================
    echo=
    echo          windows服务卸载
    echo=
    echo==============================================================
    @echo off 
    pause

    方式二:

    使用windows自带的sc命令安装或卸载服务

    正常创建windows server时,main函数如下:

    static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            static void Main()
            {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[]
                {
                    new myService()//服务
                };
                ServiceBase.Run(ServicesToRun);//在服务控制管理器 (SCM) 中注册多项服务的可执行文件。
            }
        }

    然后我们改程序入口Main方法,让其在启动时识别是Windows应用程序还是Windows服务,如果是应用程序就执行应用程序的代码,如果是服务就执行MainService的代码,如果是服务,我给了一个"s"参数,如果有这个参数就证明是Windows服务,然后启动MainService,更改后的Main如下:

    static void Main(string[] args)
    {
        //有参数,并且第一个参数时s时,执行服务注册
        if (args.Length > 0 && args[0] == "s")
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
            {
                        new MyService()//服务
            };
            ServiceBase.Run(ServicesToRun);
        }
        else//不含参数就正常运行,这里不含参数运行时,判断是安装还是卸载
        {
            Console.WriteLine("这是Windows应用程序");
            Console.WriteLine("请选择,[1]安装服务 [2]卸载服务 [3]退出");
            var rs = int.Parse(Console.ReadLine());
            switch (rs)
            {
                case 1:
                    //取当前可执行文件路径,加上"s"参数,证明是从windows服务启动该程序
                    var path = Process.GetCurrentProcess().MainModule.FileName + " s";
                    Process.Start("sc", "create myserver binpath= "" + path + "" displayName= 我的服务 start= auto");
                    //其中myserver是安装后的服务名称,displayName为安装后服务的描述,安装指向的服务文件对应的是path
                    Console.WriteLine("安装成功");
                    Process.Start("sc","start myserver");
                    Console.WriteLine("服务启动成功");
                    Console.Read();
                    break;
                case 2:
                    Process.Start("sc", "delete myserver");
                    Console.WriteLine("卸载成功");
                    Process.Start("sc", "stop myserver");//有时服务命名删除成功了,但是服务仍然存在,这可能是由于服务正在处于启动状态stop一下就消失了
                    Console.WriteLine("卸载成功");
                    Console.Read(); 
                    break; 
                case 3: 
                    break; 
            } 
        } 
    }       
         
  • 相关阅读:
    perl的eval语句
    PythonWin运行出错解决办法
    python多重继承
    perl调用shell
    python正则表达式匹配中文
    perl学习2处理用户输入
    awk介绍
    perl学习3qw及数组的应用
    perl的多线程
    perl学习5子程序中自动识别参数
  • 原文地址:https://www.cnblogs.com/lcawen/p/7722018.html
Copyright © 2011-2022 走看看