最近專案有個需求要將排程透過 Windows Service 服務來執行,在 Windows OS 要註冊 Service 可以用 cmd 與 powershell 兩種方式來建立以及刪除 Service,兩種方式之前都有使用過但要再使用時都會上網查因此決定紀錄一下未來方便查詢,此篇就針對這兩種方式進行基本介紹與說明,若有問題歡迎提出一起討論或是給予指導。
註冊服務
在 cmd 中可以透過 sc.exe 來建立 windows service,sc 全名為 service control,語法指令格式如下說明
舉例來說,要註冊 Windows Service 名為 TestService,其檔案位置在 D:\Job\TestService\Test.Jobs.exe 位置中,可以透過 create ServiceName 指令建立
- 描述:
- 在登錄和服務資料庫中建立服務項目。
- 使用方法:
- sc <server> create [service name] [binPath= ] <option1> <option2>...
- 選項:
- 注意: 選項名稱包括等號。
- 在等號和值之間必須空一格。
- type= <own|share|interact|kernel|filesys|rec|userown|usershare>
- (預設值 = own)
- start= <boot|system|auto|demand|disabled|delayed-auto>
- (預設值 = demand)
- error= <normal|severe|critical|ignore>
- (預設值 = normal)
- binPath= <.exe 檔案的二進位檔案路徑名稱>
- group= <載入順序群組>
- tag= <yes|no>
- depend= <相依性(以 / (反斜線) 隔開)>
- obj= <帳戶名稱|物件名稱>
- (預設值 = LocalSystem)
- DisplayName= <顯示名稱>
- password= <密碼>
建立成功可以看到新增 TestService 成功的訊息,接著我們使用 query ServiceName 查詢目前 service 狀態,剛建立好的 service 狀態會是 STOPPED (1)
- D:\>sc create TestService binPath="D:\Job\TestService\Test.Jobs.exe"
- [SC] CreateService 成功
- 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)
當正常執行,狀態就會更新為 RUN (4)
- 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 :
- 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 成功
以下為開啟時應用程式時用 administrator 開啟的畫面
註冊服務
在 cmd 中可以透過 sc.exe 來建立 windows service,sc 全名為 service control,語法指令格式如下說明
Name : 指定服務的名稱 (唯一)
BinaryPathName : 服務的執行檔案路徑位置
DisplayName : 顯示的名稱
StartupType : 啟動類型
Description : 描述
建立成功之後,在 GUI 呈現畫面如下
在 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
要註冊 Windows Service 名為 TestService,其檔案位置在 D:\Job\TestService\Test.Jobs.exe 位置中,可以透過 create ServiceName 指令建立
啟動服務
可以透過 start ServiceName -Name 指令來啟動服務,與 cmd 不同的是會等到 running 在顯示目前狀態
停止服務
使用 stop ServiceName 指令停止當下 windows service,執行完指令會進行停止的動作,再次查詢服務狀態就會是已停止 STOPPED
刪除服務
在 powersehll 中刪除時要特別注意,官方 MSDN 中提供的 Remove service 是 powershell 6 才提供的新功能,如果您的 powershell 版本低於 6 時候執行 remove serv 則會跳出錯誤訊息 : 無法辨識 'Remove-Service' 詞彙是否為 Cmdlet、函數,如果不確定電腦中使用的 powershell 版本為何,可以輸入以下指令,
建立成功,接著我們查詢目前 service 狀態,在 powershell 指令比 cmd 稍微多一滴滴要使用 win32service在透過 filter 來查詢剛建立好的 testservice,與 cmd 建立的相同剛建好的狀態都是 Stopped
- D:\>sc create TestService binPath="D:\Job\TestService\Test.Jobs.exe"
- [SC] CreateService 成功
- 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
powershell 是 6.0 以下
- Remove-Service someservice
- Stop-Service 'testservice'; Get-CimInstance -ClassName Win32_Service -Filter "Name='testservice'" | Remove-CimInstance
後記
透過以上簡單的介紹說明了在 cmd 與 powershell 中如何新增、刪除、查詢及修改 windows service 的各種方式與指令,如果有需要更細節的內容說是說明,可以透過 MSDN 官方網站查詢相關指令與更多的應用細節,這裡就針對簡單操作做說明不在琢磨,希望自己的金魚腦寫完這篇之後可以記錄得更清楚些 !
參考
powershell create windows service
0 意見:
張貼留言