﻿# 如何透過 C# 啟動、停止、重新啟動 Windows 服務

由於最近都在研究 Setup Project，所以在**安裝**與**解除安裝** Windows 服務程式時都會需要透過自訂動作操作 Windows 服務的啟動或停止，今天我就來分享幾個透過 C# 對 Windows 服務啟動、停止、重新啟動的方法。

首先，你要先先知道「服務名稱」與「顯示名稱」是不一樣的，而「服務名稱」才是程式要用的部分：

![「服務名稱」與「顯示名稱」是不一樣的](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f90642037049c4cce0d2-image_3.png "「服務名稱」與「顯示名稱」是不一樣的")

![Microsoft Visual Studio 2008 - Windows Service Properties](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/9533ac00203daaab8903-image_6.png "Microsoft Visual Studio 2008 - Windows Service Properties")

**啟動 Windows 服務**

```csharp
try
{
	// 已知的 Service Name
	string m_ServiceName = "Service1";
	
	// 建立 ServiceController 物件實體
	ServiceController service = new ServiceController(m_ServiceName);
	
	// 設定一個 Timeout 時間，若超過 30 秒啟動不成功就宣告失敗!
	TimeSpan timeout = TimeSpan.FromMilliseconds(1000 * 30);

	// 啟動服務
	service.Start();
	
	// 設定該服務必須在等待 timeout 時間內將狀態改變至「已啟動(Running)」的狀態
	service.WaitForStatus(ServiceControllerStatus.Running, timeout);
}
catch
{
	System.Windows.Forms.MessageBox.Show("服務無法啟動，請檢查相關設定!");
}
```

**停止 Windows 服務**

```csharp
try
{
	string m_ServiceName = "Service1";
	ServiceController service = new ServiceController(m_ServiceName);

	// 設定一個 Timeout 時間，若超過 60 秒啟動不成功就宣告失敗!
	TimeSpan timeout = TimeSpan.FromMilliseconds(1000 * 60);

	// 若該服務不是「停用」的狀態，才將其停止運作，否則會引發 Exception
	if (service.Status != ServiceControllerStatus.Stopped &&
		service.Status != ServiceControllerStatus.StopPending)
	{
		service.Stop();
		service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
	}
}
catch (Exception ex)
{
	// 如果無法停用服務會引發 Exception，也會讓反安裝自動中斷
	throw new InstallException("服務無法停用，建議您可以先利用「工作管理員」將 Service1.exe 程序結束，再進行解除安裝。");
}
```

**重新啟動 Windows 服務**

這就沒什麼特別好講的了，先停用 Windows 服務再啟動 Windows 服務而已！

**相關連結**

-   [ServiceController 類別](http://msdn.microsoft.com/zh-tw/library/system.serviceprocess.servicecontroller.aspx)
