[Windows] 註冊 Windows Service 服務

[Windows] 註冊 Windows Service 服務

2024年11月4日 星期一

[Windows] 註冊 Windows Service 服務

11月 04, 2024.NET, PowerShell, Windows ServiceNo comments

前言

最近專案有個需求要將排程透過 Windows Service 服務來執行,在 Windows OS 要註冊 Service 可以用 cmd 與 powershell 兩種方式來建立以及刪除 Service,兩種方式之前都有使用過但要再使用時都會上網查因此決定紀錄一下未來方便查詢,此篇就針對這兩種方式進行基本介紹與說明,若有問題歡迎提出一起討論或是給予指導。

使用命令提示字元 cmd

在執行時請先注意開啟 cmd 需要使用 Admin 權限執行,否則會有執行異常或是告知沒權限的錯誤訊息,以下為開啟時應用程式時用 administrator 開啟的畫面,用管理者身分執行 cmd

註冊服務

在 cmd 中可以透過 sc.exe 來建立 windows service,sc 全名為 service control,語法指令格式如下說明

描述:

在登錄和服務資料庫中建立服務項目。

使用方法:

sc create [service name] [binPath= ] ...

選項:

注意: 選項名稱包括等號。

在等號和值之間必須空一格。

type=

(預設值 = own)

start=

(預設值 = demand)

error=

(預設值 = normal)

binPath= <.exe 檔案的二進位檔案路徑名稱>

group= <載入順序群組>

tag=

depend= <相依性(以 / (反斜線) 隔開)>

obj= <帳戶名稱|物件名稱>

(預設值 = LocalSystem)

DisplayName= <顯示名稱>

password= <密碼>

舉例來說,要註冊 Windows Service 名為 TestService,其檔案位置在 D:\Job\TestService\Test.Jobs.exe 位置中,可以透過 create ServiceName 指令建立

D:\>sc create TestService binPath="D:\Job\TestService\Test.Jobs.exe"

[SC] CreateService 成功

建立成功可以看到新增 TestService 成功的訊息,接著我們使用 query ServiceName 查詢目前 service 狀態,剛建立好的 service 狀態會是 STOPPED (1)

D:\>sc query testservice

SERVICE_NAME: testservice

TYPE : 10 WIN32_OWN_PROCESS

STATE : 1 STOPPED

WIN32_EXIT_CODE : 1077 (0x435)

SERVICE_EXIT_CODE : 0 (0x0)

CHECKPOINT : 0x0

WAIT_HINT : 0x0

啟動服務

可以透過 start ServiceName 指令來啟動服務,要啟動時狀態為 START_PENDING (2)

D:\>sc start testservice

SERVICE_NAME: testservice

TYPE : 10 WIN32_OWN_PROCESS

STATE : 2 START_PENDING

(NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)

WIN32_EXIT_CODE : 0 (0x0)

SERVICE_EXIT_CODE : 0 (0x0)

CHECKPOINT : 0x0

WAIT_HINT : 0x7d0

PID : 26300

FLAGS :

當正常執行,狀態就會更新為 RUN (4)

SERVICE_NAME: testservice

TYPE : 10 WIN32_OWN_PROCESS

STATE : 4 RUNNING

(STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)

WIN32_EXIT_CODE : 0 (0x0)

SERVICE_EXIT_CODE : 0 (0x0)

CHECKPOINT : 0x0

WAIT_HINT : 0x0

停止服務

要停止服務的可以透過 stop ServiceName 指令,執行完指令會進行停止的動作,因此查看當下狀態會是 STOP_PENDING,當停止後再次查詢可以看到狀態改為 STOPPED (1)

D:\>sc stop testservice

SERVICE_NAME: testservice

TYPE : 10 WIN32_OWN_PROCESS

STATE : 3 STOP_PENDING

(STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)

WIN32_EXIT_CODE : 0 (0x0)

SERVICE_EXIT_CODE : 0 (0x0)

CHECKPOINT : 0x0

WAIT_HINT : 0x0

D:\>sc query testservice

SERVICE_NAME: testservice

TYPE : 10 WIN32_OWN_PROCESS

STATE : 1 STOPPED

WIN32_EXIT_CODE : 0 (0x0)

SERVICE_EXIT_CODE : 0 (0x0)

CHECKPOINT : 0x0

WAIT_HINT : 0x0

刪除服務

當要刪除服務的話執行 delete ServiceName 指令,其回傳訊息與 create 類似直接回傳刪除服務成功

D:\>sc delete testservice

[SC] DeleteService 成功

使用 Powershell

同樣的在執行前需要使用管理者身分執行 powershell,否則會有執行異常或是告知沒權限的錯誤訊息,

以下為開啟時應用程式時用 administrator 開啟的畫面

註冊服務

在 cmd 中可以透過 sc.exe 來建立 windows service,sc 全名為 service control,語法指令格式如下說明

PS C:\> New-Service -Name "TestService" -BinaryPathName "D:\Jobs\TestService\Jobs.exe" -DisplayName "Test Service" -StartupType Manual -Description "This is a test service."

Status Name DisplayName

------ ---- -----------

Stopped TestService Test Service

參數介紹

Name : 指定服務的名稱 (唯一)

BinaryPathName : 服務的執行檔案路徑位置

DisplayName : 顯示的名稱

StartupType : 啟動類型

Description : 描述

建立成功之後,在 GUI 呈現畫面如下

要註冊 Windows Service 名為 TestService,其檔案位置在 D:\Job\TestService\Test.Jobs.exe 位置中,可以透過 create ServiceName 指令建立

D:\>sc create TestService binPath="D:\Job\TestService\Test.Jobs.exe"

[SC] CreateService 成功

建立成功,接著我們查詢目前 service 狀態,在 powershell 指令比 cmd 稍微多一滴滴要使用 win32service在透過 filter 來查詢剛建立好的 testservice,與 cmd 建立的相同剛建好的狀態都是 Stopped

PS C:\> Get-WmiObject win32_service -Filter "name='testservice'"

ExitCode : 1077

Name : TestService

ProcessId : 0

StartMode : Manual

State : Stopped

Status : OK

啟動服務

可以透過 start ServiceName -Name 指令來啟動服務,與 cmd 不同的是會等到 running 在顯示目前狀態

PS C:\> Start-Service -Name "testservice"

PS C:\> Get-WmiObject win32_service -Filter "name='testservice'"

ExitCode : 0

Name : TestService

ProcessId : 18188

StartMode : Manual

State : Running

Status : OK :

停止服務

使用 stop ServiceName 指令停止當下 windows service,執行完指令會進行停止的動作,再次查詢服務狀態就會是已停止 STOPPED

PS C:\> Stop-Service -Name "testservice"

PS C:\> Get-WmiObject win32_service -Filter "name='testservice'"

ExitCode : 0

Name : TestService

ProcessId : 0

StartMode : Manual

State : Stopped

Status : OK

刪除服務

在 powersehll 中刪除時要特別注意,官方 MSDN 中提供的 Remove service 是 powershell 6 才提供的新功能,如果您的 powershell 版本低於 6 時候執行 remove serv 則會跳出錯誤訊息 : 無法辨識 'Remove-Service' 詞彙是否為 Cmdlet、函數,如果不確定電腦中使用的 powershell 版本為何,可以輸入以下指令,

PS C:\> $PSVersionTable.PSVersion

Major Minor Build Revision

----- ----- ----- --------

5 1 17763 316

因此,Remove service 會根據版本不同執行不同的指令,如果 powershell 是 6.0 或以上請輸入指令

Remove-Service someservice

powershell 是 6.0 以下

Stop-Service 'testservice'; Get-CimInstance -ClassName Win32_Service -Filter "Name='testservice'" | Remove-CimInstance

後記

透過以上簡單的介紹說明了在 cmd 與 powershell 中如何新增、刪除、查詢及修改 windows service 的各種方式與指令,如果有需要更細節的內容說是說明,可以透過 MSDN 官方網站查詢相關指令與更多的應用細節,這裡就針對簡單操作做說明不在琢磨,希望自己的金魚腦寫完這篇之後可以記錄得更清楚些 !

參考

powershell create windows service

Share This:

Facebook Twitter Google+ Stumble Digg

以電子郵件傳送這篇文章BlogThis!分享至 X分享至 Facebook

較新的文章

較舊的文章

首頁

0

意見:

張貼留言

相关推荐

【2024新款推荐】十大穿墙王路由器,信号强到无处不在!
什么的梦填词语(一年级什么的梦是高的)
硬度不足要如何改善?無法持久硬不起來的原因、評估、治療
长白山天池
365dni讲解

长白山天池

📅 01-10 👁️ 7489
卡塔尔世界杯赛况速递:韩国、瑞士惊险晋级 巴西输球无缘小组全胜
2022年俄罗斯男足队长资料介绍
365dni讲解

2022年俄罗斯男足队长资料介绍

📅 09-14 👁️ 1372
影视取景地文化:《千山暮雪》《花红花火》,原来是在这里取景的
EMS那么慢,为什么还有那么多人选择EMS来收发邮件?
什么溯溪鞋品牌好一些 这些溯溪鞋品牌值得选→十大品牌网