1. 程式人生 > >Windows服務程式碼控制安裝解除安裝、啟動停止

Windows服務程式碼控制安裝解除安裝、啟動停止

前文書提到Windows服務控制相關方法很多,命令列、程式碼都可,這裡寫點我自己比較常用的方法之一

話不多說,開始建立傻瓜式服務程式

1.首先是建立一個Windows服務專案,開啟VS建立專案,選擇 “Windows服務

2.創建出的專案預設是服務檔名為 Service1.cs,我習慣在這裡改一下名,例如“MyService”.

雙擊MyService.cs會出現如下介面,先新增安裝程式。工作區右鍵選擇“新增安裝程式


3.安裝服務新增後預設檔名為ProjectInstaller.cs,無需修改。同時安裝程式工作區會多出兩個元件


在元件上右鍵選擇“屬性


4.serviceProcessInstaller1屬性如下


其中比較重要的是Account屬性,其取值有

  • LocalService(本地服務使用者)

充當本地計算機上非特權使用者的帳戶,該帳戶將匿名憑據提供給所有遠端伺服器。

  • NetworkService(網路使用者)

提供廣泛的本地特權的帳戶,該帳戶將計算機的憑據提供給所有遠端伺服器。

  • LocalSystem(本地系統使用者)

服務控制管理員使用的帳戶,它具有本地計算機上的許多許可權並作為網路上的計算機。

  • User(指定使用者)

由網路上特定的使用者定義的帳戶。 如果為 成員指定 User,則會使系統在安裝服務時提示輸入有效的使用者名稱和密碼,除非您為 ServiceProcessInstaller

 例項的 和 這兩個屬性設定值。

如果要使用UNC,則必須使用NetworkService或User;

LocalSystem許可權比較大,本地服務使用這個可以避免不少問題,當然指定User也是不錯的選擇

5.serviceInstaller1屬性中比較重要的是ServiceName,這個即服務名稱


啟動、停止我們暫不關心,開啟Program.cs

預設會給出一個Main()函式,不帶引數,這裡準備用引數來控制服務,因此給main加上引數

static void Main(string[] args)
這裡需要注意,使用者呼叫的程式進入的是使用者互動模式,系統呼叫則是非使用者互動模式(叫什麼我也不知道。。。)

判斷是否是使用者互動模式用 Environment.UserInteractive,加上引數判斷,我們的main函式程式設計如下所示:

static void Main(string[] args)
{
	if (Environment.UserInteractive)
	{
		string param = string.Concat(args);
		switch (param)
		{
			case "--install":
				break;
			case "--uninstall":
				break;
			case "--start":
				break;
			case "--stop":
				break;
			default:
				break;
		}
	} 
	else
	{
		ServiceBase[] ServicesToRun;
		ServicesToRun = new ServiceBase[]
		{
			new MyService()
		};
		ServiceBase.Run(ServicesToRun);
	}
}

這裡用ManagedInstallerClass.InstallHelper來安裝、解除安裝服務

ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location });	//安裝服務
ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location });	//解除安裝服務

需要新增名稱空間

using System.Configuration.Install;
using System.Reflection;
將其新增到switch..case...中
case "--install":
ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location });	//安裝服務
break;
case "--uninstall":
ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location });	//解除安裝服務
break;


啟動和停止服務這裡用ServiceController

/// <summary>
/// 啟動服務
/// </summary>
/// <param name="srv_name">服務名稱</param>
/// <param name="time_out">啟動超時,預設30秒</param>
/// <returns>成功:true,失敗:false</returns>
public static bool StartService(string srv_name, int time_out = 30000)
{
	ServiceController service = new ServiceController(srv_name);
	try
	{
		TimeSpan timeout = TimeSpan.FromMilliseconds(time_out);
		service.Start();
		service.WaitForStatus(ServiceControllerStatus.Running, timeout);
		return true;
	}
	catch (Exception ex)
	{
		System.Diagnostics.Debug.WriteLine(ex.ToString());
		return false;
	}
}

/// <summary>
/// 停止服務
/// </summary>
/// <param name="srv_name">服務名稱</param>
/// <param name="time_out">停止超時,預設30秒</param>
/// <returns>成功:true,失敗:false</returns>
public static bool StopService(string srv_name, int time_out = 30000)
{
	ServiceController service = new ServiceController(srv_name);
	try
	{
		TimeSpan timeout = TimeSpan.FromMilliseconds(time_out);
		service.Stop();
		service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
		return true;
	}
	catch (Exception ex)
	{
		System.Diagnostics.Debug.WriteLine(ex.ToString());
		return false;
	}
}
新增到switch...case...中
case "--start":
	StartService("MyService");
	break;
case "--stop":
	StopService("MyService");
	break;


這樣服務程式就完成了,至於服務的實現,這裡就不多說了,以後有時間再說。

編譯測試一下。

MyService --install

正在安裝服務 MyService...
已成功安裝服務 MyService。
正在日誌 Application 中建立 EventLog 源 MyService...

“安裝”階段已成功完成,正在開始“提交”階段。
檢視日誌檔案的內容以獲得 F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.exe 程式集的進度。
該檔案位於 F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.InstallLog。
正在提交程式集“F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.exe”。
受影響的引數是:
   logtoconsole = 
   logfile = F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.InstallLog
   assemblypath = F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.exe

“提交”階段已成功完成。

已完成事務處理安裝。

MyService --start


MyService --stop


MyService --uninstall

正在開始解除安裝。
檢視日誌檔案的內容以獲得 F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.exe 程式集的進度。
該檔案位於 F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.InstallLog。
正在解除安裝程式集“F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.exe”。
受影響的引數是:
   logtoconsole = 
   logfile = F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.InstallLog
   assemblypath = F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.exe
“MyService.vshost.exe”(CLR v4.0.30319: MyService.vshost.exe): 已載入“C:\Windows\Microsoft.Net\assembly\GAC_MSIL\SMDiagnostics\v4.0_4.0.0.0__b77a5c561934e089\SMDiagnostics.dll”。已跳過載入符號。模組進行了優化,並且偵錯程式選項“僅我的程式碼”已啟用。
“MyService.vshost.exe”(CLR v4.0.30319: MyService.vshost.exe): 已載入“C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.ServiceModel.Internals\v4.0_4.0.0.0__31bf3856ad364e35\System.ServiceModel.Internals.dll”。已跳過載入符號。模組進行了優化,並且偵錯程式選項“僅我的程式碼”已啟用。
“MyService.vshost.exe”(CLR v4.0.30319: MyService.vshost.exe): 已載入“C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.ServiceProcess.resources\v4.0_4.0.0.0_zh-Hans_b03f5f7f11d50a3a\System.ServiceProcess.resources.dll”。模組已生成,不包含符號。
正在移除 EventLog 源 MyService。
正在從系統中移除服務 MyService...
已成功地從系統中移除服務 MyService。

解除安裝完成。



相關推薦

Windows服務程式碼控制安裝解除安裝啟動停止

前文書提到Windows服務控制相關方法很多,命令列、程式碼都可,這裡寫點我自己比較常用的方法之一 話不多說,開始建立傻瓜式服務程式 1.首先是建立一個Windows服務專案,開啟VS建立專案,選擇 “Windows服務” 2.創建出的專案預設是服務檔名為 Servic

C#或 VB.NET通過 ServiceController 程式碼控制Windows服務安裝解除安裝過程出錯,對windows服務程式檔案佔用,無法釋放資源問題

一、VS報的錯誤 二、程式碼 三、錯誤分析 1.首先,這個錯誤是因為檔案許可權問題引起的,筆者系統為WIN10,VS2017。筆者在給要控制安裝啟動的windows服務程式資料夾新增上“Everyone”許可權後,是可以正常通過程式碼正常控制windows服務的安裝、

C# VB.NET 安裝解除安裝windows服務錯誤

一、背景 筆者自己使用vs2017編寫了一個數據採集的windows服務程式(.net4.5),同時又編寫了一個控制windows服務安裝解除安裝的winform程式(.net3.5)。   二、錯誤資訊 {System.BadImageFormatException: 未

bat批處理指令碼命令安裝解除安裝windows服務-InstallUtil.exe和sc命令

1、使用Visiual Studio安裝正常流程開發Window服務,增加服務安裝類,配置服務安裝屬性,服務名稱設定為TestSvr(可自行修改為其他名稱),編譯,如下: 2、安裝.net 框架後,根據服務使用的框架版本,將C:\WINDOWS\Microsoft.NET\Framew

c# 編寫windows 服務,並制作安裝

階段 其他 編譯 code 工程 component partial 控制臺程序 自定義   對服務的認識有很多個階段。   第一階段:當時還在用c++,知道在一個進程裏while(True){},然後裏面做很多很多事情,這就叫做服務了,界面可能當時還用Console控

通過批處理進行Windows服務安裝/卸載&啟動/停止

spa windows服務 lse nbsp off checked ram service window 安裝服務 1 @echo off 2 3 set checked=2 4 set PATHS=%~sdp0 5 6 echo 按任意鍵執行安裝……?

VS2005 建立Windows服務程式,打包成安裝檔案

一、建立服務程式1. 選單欄“檔案”--->“新建”--->“專案”,在專案型別中選擇“windows”,模板中--->“windows 服務”。專案名稱任意起。   新專案中會建立 Program.cs , Service1.cs及其他的檔案或資料夾 2.

mysql安裝解除安裝-windows

 安裝:(注意點) 官網download安裝包 choose setup type --> custom 安裝路徑 detailed configuration developer machine multifuncitonal database manutal setting

VMware Workstation 在 Windows 主機上不完全解除安裝後執行清理 (1308)

Last Updated: 2017/3/24   Details:   免責宣告:本文為 Cleaning up after an incomplete uninstallation on a Windows host (1308)的翻譯版本

windows服務的一些命令(安裝mongdb時候遇到的)

SC Delete 服務名 可以刪除服務CMD命令列中,檔名有空格怎麼輸入?把檔名用"" 引號引起來就可以了,例如"c:\Program Files"。用來啟動服務mongod --config "

Java7Java8 安裝解除安裝問題

win7 系統,同時安裝了JDK7和JDK8,解除安裝了JDK8之後,cmd命令列輸入:java -version ,本以為顯示java版本1.7,結果彈錯:has value '1.7',but '1.8' is required. 我檢視JAVA_HOME,環境變

Windows下Myeclipse不能解除安裝的解決方案Failed to load Library jvm

重新安裝myeclipse還是解除安裝myeclipse都會提示Failed to load library jvm。解決辦法就是解除安裝乾淨之後重新安裝。 在window是下myeclipse沒有直

Docker 安裝解除安裝

Docker 安裝解除安裝 Mac、Windows安裝Docker Mac、Windows安裝很簡單,到官網下載最新的Docker安裝包,Mac電腦直接拖拽到Application中即可。Windows直接雙擊,一直點選下一步即可。 CentOS 安裝

C# vs2008 建立Windows服務程式,打包成安裝檔案

c# 開發windows服務程式。一個簡單的服務程式示例。歸納了幾點。有不足之處,請賜教。一、建立服務程式1. 選單欄“檔案”--->“新建”--->“專案”,在專案型別中選擇“windows”,模板中--->“windows 服務”。專案名稱任意起。  新

安裝VS2008,在Win7系統下,無法像xp下通過“控制面板”解除安裝的方法重新輸入序列號來破解VS2008。

在Win7系統下,無法像xp下通過“控制面板”解除安裝的方法重新輸入序列號來破解VS2008。 但可以通過以下幾個步驟來破解: 1.首先需要安裝VS2008,可以安裝VS2008專業版90天試用版或VS2008團隊版90天試用版都行。 2.安裝完成後,到“控制

使用bat檔案安裝解除安裝Window服務

1.安裝服務 @echo off  @title 安裝windows服務 path %SystemRoot%\Microsoft.NET\Framework\v4.0.30319 echo======

centOS 7 安裝解除安裝docker

安裝   解除安裝  1. 檢查安裝過的包       yum list installed | grep docker 2. 刪除安裝的軟體包       yum -y remove

window service 批處理安裝/解除安裝命令

開啟服務 @echo.服務啟動...... @echo off @sc create 服務名 binPath= "C:\Users\Administrator\Desktop\win32srvdemo\win32srvdemo\Debug\win32srvdemo.exe" @net

Linux環境下安裝/解除安裝軟體

Ubuntu環境下:使用apt-get工具 ●什麼時apt-get? 高階包裝工具(Advanced Packaging Tools ,簡稱APT),是Debian及其衍生髮行版(如:ubuntu)的軟體包管理器。APT可以自動下載,配置,安裝二進位制或者原始碼格式的軟 件包,因此簡

centos mariadb 安裝 解除安裝 刪除殘留檔案

安裝 //檢視電腦是否有檔案 [[email protected] /]# rpm -qa|grep mariadb 如果沒有檔案可以使用下面命令 [[email protected] ~]# yum install -y mariadb mariadb-server m