只有累積,沒有奇蹟

2024年11月4日 星期一

[Windows] 註冊 Windows Service 服務

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

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

註冊服務
在 cmd 中可以透過 sc.exe 來建立 windows service,sc 全名為 service control,語法指令格式如下說明
  1. 描述:
  2. 在登錄和服務資料庫中建立服務項目。
  3. 使用方法:
  4. sc <server> create [service name] [binPath= ] <option1> <option2>...
  5.  
  6. 選項:
  7. 注意: 選項名稱包括等號。
  8. 在等號和值之間必須空一格。
  9. type= <own|share|interact|kernel|filesys|rec|userown|usershare>
  10. (預設值 = own)
  11. start= <boot|system|auto|demand|disabled|delayed-auto>
  12. (預設值 = demand)
  13. error= <normal|severe|critical|ignore>
  14. (預設值 = normal)
  15. binPath= <.exe 檔案的二進位檔案路徑名稱>
  16. group= <載入順序群組>
  17. tag= <yes|no>
  18. depend= <相依性(以 / (反斜線) 隔開)>
  19. obj= <帳戶名稱|物件名稱>
  20. (預設值 = LocalSystem)
  21. DisplayName= <顯示名稱>
  22. password= <密碼>
舉例來說,要註冊 Windows Service 名為 TestService,其檔案位置在 D:\Job\TestService\Test.Jobs.exe 位置中,可以透過  create ServiceName  指令建立
  1. D:\>sc create TestService binPath="D:\Job\TestService\Test.Jobs.exe"
  2. [SC] CreateService 成功
建立成功可以看到新增 TestService 成功的訊息,接著我們使用   query ServiceName  查詢目前 service 狀態,剛建立好的 service 狀態會是 STOPPED (1)
  1. D:\>sc query testservice
  2.  
  3. SERVICE_NAME: testservice
  4. TYPE : 10 WIN32_OWN_PROCESS
  5. STATE : 1 STOPPED
  6. WIN32_EXIT_CODE : 1077 (0x435)
  7. SERVICE_EXIT_CODE : 0 (0x0)
  8. CHECKPOINT : 0x0
  9. WAIT_HINT : 0x0

啟動服務
可以透過  start ServiceName  指令來啟動服務,要啟動時狀態為 START_PENDING (2)
  1. D:\>sc start testservice
  2.  
  3. SERVICE_NAME: testservice
  4. TYPE : 10 WIN32_OWN_PROCESS
  5. STATE : 2 START_PENDING
  6. (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
  7. WIN32_EXIT_CODE : 0 (0x0)
  8. SERVICE_EXIT_CODE : 0 (0x0)
  9. CHECKPOINT : 0x0
  10. WAIT_HINT : 0x7d0
  11. PID : 26300
  12. FLAGS :
當正常執行,狀態就會更新為 RUN (4) 
  1. SERVICE_NAME: testservice
  2. TYPE : 10 WIN32_OWN_PROCESS
  3. STATE : 4 RUNNING
  4. (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
  5. WIN32_EXIT_CODE : 0 (0x0)
  6. SERVICE_EXIT_CODE : 0 (0x0)
  7. CHECKPOINT : 0x0
  8. WAIT_HINT : 0x0

停止服務
要停止服務的可以透過  stop ServiceName 指令,執行完指令會進行停止的動作,因此查看當下狀態會是 STOP_PENDING,當停止後再次查詢可以看到狀態改為 STOPPED (1)
  1. D:\>sc stop testservice
  2.  
  3. SERVICE_NAME: testservice
  4. TYPE : 10 WIN32_OWN_PROCESS
  5. STATE : 3 STOP_PENDING
  6. (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
  7. WIN32_EXIT_CODE : 0 (0x0)
  8. SERVICE_EXIT_CODE : 0 (0x0)
  9. CHECKPOINT : 0x0
  10. WAIT_HINT : 0x0
  11.  
  12. D:\>sc query testservice
  13.  
  14. SERVICE_NAME: testservice
  15. TYPE : 10 WIN32_OWN_PROCESS
  16. STATE : 1 STOPPED
  17. WIN32_EXIT_CODE : 0 (0x0)
  18. SERVICE_EXIT_CODE : 0 (0x0)
  19. CHECKPOINT : 0x0
  20. WAIT_HINT : 0x0

刪除服務
當要刪除服務的話執行  delete ServiceName  指令,其回傳訊息與 create 類似直接回傳刪除服務成功
  1. D:\>sc delete testservice
  2. [SC] DeleteService 成功

使用 Powershell 
同樣的在執行前需要使用管理者身分執行 powershell,否則會有執行異常或是告知沒權限的錯誤訊息,
以下為開啟時應用程式時用 administrator 開啟的畫面

註冊服務
在 cmd 中可以透過 sc.exe 來建立 windows service,sc 全名為 service control,語法指令格式如下說明
  1. PS C:\> New-Service -Name "TestService" -BinaryPathName "D:\Jobs\TestService\Jobs.exe" -DisplayName "Test Service" -StartupType Manual -Description "This is a test service."
  2.  
  3. Status Name DisplayName
  4. ------ ---- -----------
  5. Stopped TestService Test Service
參數介紹


  • Name : 指定服務的名稱 (唯一)
  • BinaryPathName : 服務的執行檔案路徑位置
  • DisplayName : 顯示的名稱
  • StartupType : 啟動類型
  • Description : 描述
  • 建立成功之後,在 GUI 呈現畫面如下
    要註冊 Windows Service 名為 TestService,其檔案位置在 D:\Job\TestService\Test.Jobs.exe 位置中,可以透過  create ServiceName  指令建立
    1. D:\>sc create TestService binPath="D:\Job\TestService\Test.Jobs.exe"
    2. [SC] CreateService 成功
    建立成功,接著我們查詢目前 service 狀態,在 powershell 指令比 cmd 稍微多一滴滴要使用 win32service在透過 filter 來查詢剛建立好的 testservice,與 cmd 建立的相同剛建好的狀態都是 Stopped 
    1. PS C:\> Get-WmiObject win32_service -Filter "name='testservice'"
    2.  
    3. ExitCode : 1077
    4. Name : TestService
    5. ProcessId : 0
    6. StartMode : Manual
    7. State : Stopped
    8. Status : OK

    啟動服務
    可以透過  start ServiceName -Name  指令來啟動服務,與 cmd 不同的是會等到 running 在顯示目前狀態
    1. PS C:\> Start-Service -Name "testservice"
    2. PS C:\> Get-WmiObject win32_service -Filter "name='testservice'"
    3.  
    4. ExitCode : 0
    5. Name : TestService
    6. ProcessId : 18188
    7. StartMode : Manual
    8. State : Running
    9. Status : OK :

    停止服務
    使用  stop ServiceName  指令停止當下 windows service,執行完指令會進行停止的動作,再次查詢服務狀態就會是已停止 STOPPED
    1. PS C:\> Stop-Service -Name "testservice"
    2. PS C:\> Get-WmiObject win32_service -Filter "name='testservice'"
    3.  
    4. ExitCode : 0
    5. Name : TestService
    6. ProcessId : 0
    7. StartMode : Manual
    8. State : Stopped
    9. Status : OK

    刪除服務
    在 powersehll 中刪除時要特別注意,官方 MSDN 中提供的 Remove service 是 powershell 6 才提供的新功能,如果您的 powershell 版本低於 6 時候執行 remove serv 則會跳出錯誤訊息 : 無法辨識 'Remove-Service' 詞彙是否為 Cmdlet、函數,如果不確定電腦中使用的 powershell 版本為何,可以輸入以下指令
    1. PS C:\> $PSVersionTable.PSVersion
    2.  
    3. Major Minor Build Revision
    4. ----- ----- ----- --------
    5. 5 1 17763 316
    因此,Remove service 會根據版本不同執行不同的指令,如果 powershell 是 6.0 或以上請輸入指令
    1. Remove-Service someservice 
    powershell 是 6.0 以下
    1. Stop-Service 'testservice'; Get-CimInstance -ClassName Win32_Service -Filter "Name='testservice'" | Remove-CimInstance

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

    參考
    powershell create windows service

    Related Posts:

    • [Windows] 註冊 Windows Service 服務前言 最近專案有個需求要將排程透過 Windows Service 服務來執行,在 Windows OS 要註冊 Service 可以用  cmd  與  powershell  兩種方式來建立以及刪除 Service,兩種方式之前都有使用過但要再使用時都會上網查因此決定紀錄一下未來方便查詢,此篇就針對這兩種方式進行基本介紹與說明,若有問題歡迎提出一起討論或是給予指導… Read More
    • [PowerShell] 設定 IIS - 建立 Application Pool、WebSite前言 PowerShell是微軟公司開發的任務自動化和組態管理框架,相信有接觸過 CI / CD 的人都是聽過且用過這工具,今天就來簡單介紹如何使用 PowerShell 來建立 Application Pool 跟 WebSite 的過程 指令說明 輸入指令 相關指令可以參考 WebAdministration # import module Import-Module WebAdministration cd IIS:\AppPoo… Read More
    • [Powershell] Windows中開啟PowerShell的幾種方式前言  前幾天在看兩同事討論 powershell 的應用時,討論到後來太抽象決定直接開 code 討論大打出手,竟然發現有自己不知道開啟 powershell 的方式,世界之大無奇不有為了紀念自己的無知,特此紀錄於此篇文章宣告天下自己的愚蠢,也希望如果有跟我一樣狀況的人可以偷學到這些小眉眉角角,然後在跟自己同事討論時再說"什麼! 這你也不會喔" 這種幹話來提高自己在公司的身分地位(誤 開啟 Powershell 方式&n… Read More

    0 意見:

    張貼留言

    Copyright © 2025 m@rcus 學習筆記 | Powered by Blogger

    Design by Anders Noren | Blogger Theme by NewBloggerThemes.com