Windows下sc create命令行注冊服務


如何將VS下Windows服務項目生成的exe注冊為windows服務,讓其直接從后台運行

方法一:使用windows自帶的命令sc,首先我們要用管理員運行cmd

注冊服務:

sc create TestService binpath= "D:\Test\Test.WindowsService.exe" start= auto displayname= "Windows測試服務"

注意:所有的等號和值之間需要一個空格(等號前不要空格,等號后要一個空格) !!

——binpath和等號之間不要空格,等號和安裝路徑(例如"= D:\Test\Test.WindowsService.exe")之間要空格 

binpath:你的應用程序所在的路徑。

displayname:服務顯示的名稱。

description:服務描述說明。

如何判斷服務是否注冊成功:

在cmd中輸入services.msc打開系統服務,查看是否出現“Windows測試服務”(即displayname=后面的參數,我這里設置的是“Windows測試服務”)

修改描述: 

sc description TestService "這是一個Windows測試服務。" 

啟動服務

net start TestService 

停止服務

net stop TestService 

刪除服務

sc delete TestService  

SC命令的更多用法請在查看help sc 

使用時我們一般用個文本文檔寫入命令然后保存成bat格式的文件,添加服務一個,刪除服務一個。

例如 “添加服務.bat” 或 Install.bat 內容如下:

@echo off
echo 正在安裝服務請稍等...
set curdir=%~dp0
cd /d %curdir%
sc create TestService binpath= "D:\Test\Test.WindowsService.exe" start= auto displayname= "Windows測試服務"
sc description TestService "Windows測試服務,不要刪除"
echo -----------------------------
echo    服務安裝成功
echo -----------------------------
echo 正在啟動服務請稍等...
net start TestService
echo -----------------------------
echo    服務啟動成功
echo -----------------------------
pause

刪除服務.bat” 或 unInstall.bat 內容如下:

@echo off
echo 正在停止服務請稍等...
net stop TestService
echo -----------------------------
echo      服務停止成功
echo -----------------------------
echo 正在卸載服務請稍等...
set curdir=%~dp0
cd /d %curdir%
sc delete TestService
echo -----------------------------
echo      服務卸載成功
echo -----------------------------
pause

方法二:在Windows服務項目中引入(Topshelf是一個開源的跨平台的宿主服務框架),並且在Program.cs 和 App.config 中做如下配置:

Program.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using Topshelf;
using Test.WindowsService.BusService;

namespace Test.WindowsService
{
  /// <summary>
  /// Topshelf是一個開源的跨平台的宿主服務框架,支持Windows和Mono
  /// </summary>
  public static class Program
  {
    /// <summary>
    /// 應用程序的主入口點。
    /// </summary>
    public static void Main()
    {
      //ServiceBase[] ServicesToRun;
      //ServicesToRun = new ServiceBase[]
      //{
      //          new Service1()
      //};
      //ServiceBase.Run(ServicesToRun);

      try
      {
        var serviceName = System.Configuration.ConfigurationManager.AppSettings["ServiceName"];
        var displayName = System.Configuration.ConfigurationManager.AppSettings["DisplayName"];
        var description = System.Configuration.ConfigurationManager.AppSettings["Description"];

        //方式一加載配置文件(配置文件和exe執行文件放在同一目錄,配置文件屬性設置成始終復制)
        //string assemblyFilePath = Assembly.GetExecutingAssembly().Location;
        //string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);
        //string configFilePath = assemblyDirPath + "\\log4net.config";
        //log4net.Config.XmlConfigurator.Configure(new FileInfo(configFilePath));
        //log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));

        //配置和運行宿主服務
        HostFactory.Run(x =>
        {
          //方式二加載配置文件(配置文件和exe執行文件放在同一目錄,配置文件屬性設置成始終復制)
          x.UseLog4Net("log4net.config");
          //x.UseLog4Net();

          //注冊服務
          //x.Service(settings => new TopshelfService());
          //x.Service<TopshelfService>();
          x.Service<MqttService>();
          //x.Service<TimerService>(s =>
          //{
          //  s.ConstructUsing(name => new TimerService());
          //  s.WhenStarted(tc => tc.Start());
          //  s.WhenStopped(tc => tc.Stop());
          //  s.WhenPaused(tc => tc.Stop());
          //  s.WhenContinued(tc => tc.Start());
          //});

          //x.Service<DemoService>(s =>
          //{
          //  //指定服務類型
          //  s.ConstructUsing(name => new DemoService());
          //  //當服務啟動后執行什么
          //  s.WhenStarted(tc => tc.Start());
          //  //當服務停止后執行什么
          //  s.WhenStopped(tc => tc.Stop());
          //});

          //服務用本地系統賬號來運行
          x.RunAsLocalSystem();

          //服務描述信息
          x.SetDescription(description);
          //服務顯示名稱
          x.SetDisplayName(displayName);
          //服務名稱
          x.SetServiceName(serviceName);

          ////服務描述信息
          //x.SetDescription("Windows測試服務,不要刪除");
          ////服務顯示名稱
          //x.SetDisplayName("Windows測試服務");
          ////服務名稱
          //x.SetServiceName("TestService");

          x.EnablePauseAndContinue();

        });
      }
      catch (Exception ex)
      {
        Console.WriteLine(ex);
      }
    }
  }
}
View Code

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="ServiceName" value="TestService" />
        <add key="DisplayName" value="Windows測試服務" />
        <add key="Description" value="Windows測試服務,不要刪除" />        
        <!--配置的應用唯一標識app 例: b2b_orderWeb-->
        <add key="configApp" value="Test.WindowsService" />
        <!--配置的版本  例: 1.0.0.0-->
        <add key="configVerion" value="1.0.0.0" />
    </appSettings>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
</configuration>
View Code

log4net.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <!--Console部分log輸出格式的設定 -->
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message %newline"/>
      </layout>
    </appender>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="D:\vhost\logs\ExampleWindowsService\" />
      <!--追加日志內容-->
      <appendToFile value="true"/>
      <!--可以為:Once|Size|Date|Composite-->
      <!--Composite為Size和Date的組合-->
      <rollingStyle value="Date"/>
      <!--當備份文件時,為文件名加的后綴,這里可以作為每一天的日志分別存儲不同的文件-->
      <datePattern value="yyyy-MM-dd.TXT" />
      <!--日志最大個數,都是最新的-->
      <!--rollingStyle節點為Size時,只能有value個日志-->
      <!--rollingStyle節點為Composite時,每天有value個日志-->
      <maxSizeRollBackups value="200" />
      <!--可用的單位:KB|MB|GB-->
      <maximumFileSize value="20MB" />
      <!--置為true,當前最新日志文件名永遠為file節中的名字-->
      <staticLogFileName value="false" />
      <!--防止多線程時不能寫Log,官方說線程非安全-->
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout">
        <!--日志輸出格式:時間  日志類型  日志內容-->
        <conversionPattern value="%date [%thread] %-5level %logger - %message %newline" />
      </layout>
    </appender>
    <root>
      <level value="ALL"/>
      <appender-ref ref="ConsoleAppender"/>
      <appender-ref ref="RollingLogFileAppender"/>
    </root>
  </log4net>
</configuration>
View Code

例如 “添加服務.bat” 或 Install.bat 內容如下:

@echo off
echo 正在安裝服務請稍等...
set curdir=%~dp0
cd /d %curdir%
..\bin\Debug\Test.WindowsService.exe install 
echo -----------------------------
echo    服務安裝成功
echo -----------------------------
echo 正在啟動服務請稍等...
net start TestService
echo -----------------------------
echo    服務啟動成功
echo -----------------------------
pause

刪除服務.bat” 或 unInstall.bat 內容如下:

@echo off
echo 正在停止服務請稍等...
net stop TestService
echo -----------------------------
echo      服務停止成功
echo -----------------------------
echo 正在卸載服務請稍等...
set curdir=%~dp0
cd /d %curdir%
..\bin\Debug\Test.WindowsService.exe uninstall 
echo -----------------------------
echo      服務卸載成功
echo -----------------------------
pause

快捷方式:以管理員身份運行bat文件安裝和卸載

下面是用手動方式服務安裝、啟動和卸載

使用管理員身份cmd命令進入相應的文件夾位置

安裝:Test.WindowsService.exe install

啟動:Test.WindowsService.exe start

停止:Test.WindowsService.exe stop

卸載:Test.WindowsService.exe uninstall

方法三:

無法從命令行或調試器啟動服務,必須首先安裝Windows服務(使用installutil.exe),然后用ServerExplorer、Windows服務器管理工具或NET START命令啟動它

1. 以管理員身份運行cmd

2. 安裝windows服務

  cd C:\Windows\Microsoft.NET\Framework\v4.0.30319(InstallUtil.exe的路徑,注意InstallUtil.exe的版本號需要和項目的版本號相同)

3. 安裝windows服務

  InstallUtil.exe D:\Service\需要安裝的服務.exe(項目的路徑)

4. 啟動windows服務

  net start TestServive(服務名稱)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM