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 "
Java7、Java8 安裝解除安裝問題
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