windows-services - service教學 - write window service




如何解決“指定的服務已被標記為刪除”錯誤 (11)

我嘗試使用sc delete <service name> Windows服務,並遇到以下錯誤:

[SC] DeleteService失敗1072:

指定的服務已被標記為刪除。

我已經做了什麼:

  • 顯然,停止服務。 sc queryex "<service name>"給出以下結果:

    SERVICE_NAME: Stub service
            TYPE               : 10  WIN32_OWN_PROCESS
            STATE              : 1  STOPPED
            WIN32_EXIT_CODE    : 1067  (0x42b)
            SERVICE_EXIT_CODE  : 0  (0x0)
            CHECKPOINT         : 0x0
            WAIT_HINT          : 0x0
            PID                : 0
            FLAGS              :
    
  • 確保Microsoft管理控制台已關閉 ( taskkill /F /IM mmc.exe ),

  • 確保事件查看器已關閉 ,

  • 從註冊表中刪除鍵HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ <服務名稱> 。

    由於此刪除, services.msc仍顯示該服務(具有名稱,但沒有狀態或啟動類型),但描述為“<無法讀取說明。 錯誤代碼:2>“。 當試圖查看屬性時,“系統找不到指定的文件”,顯示五次。

問題依然存在。

你下一步怎麼做?


步驟如下:

步驟1轉到位置C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319

步驟2運行命令:installutil / u full-path / servicename.exe

步驟3關閉服務面板並重新打開它

步驟4運行命令:installutil full-path / servicename.exe


可能有幾個原因導致服務被卡在“標記為刪除”中。

  1. SysInternals的Process Explorer打開 。 關閉它應該會導致服務自動刪除。

  2. 任務管理器已打開

  3. Microsoft管理控制台(MMC)已打開 。 要確保關閉所有實例,請運行taskkill /F /IM mmc.exe

  4. 服務控制台打開 。 這與以前的觀點相同,因為服務控制台由MMC託管。

  5. 事件查看器已打開 。 再次,這與第一點相同。

  6. 鍵HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ {服務名稱}存在 。

  7. 其他人登錄到服務器並打開了前面提到的其中一個應用程序。

  8. 用於調試服務的Visual Studio實例已打開。


在我的情況下,它在關閉Services之後起作用。 檢查Services.msc是否打開,如果是,關閉它並檢查在Task Manager找到的任何服務進程。


在我的情況下,它是由創建eventLog源時未處理的異常引起的。 使用try catch來指出原因。


如上建議刪除註冊表項讓我的服務停留在停止狀態。 以下程序適用於我:

打開任務管理器>選擇服務選項卡>選擇服務>右鍵單擊並選擇“去處理”>右鍵單擊該進程並選擇結束進程

服務應該在此之後消失


如果@MainMa提供的步驟不起作用,請按照以下步驟操作

步驟1嘗試從Windows任務管理器或使用taskkill / F / PID查殺進程。 您可以通過命令'sc queryex'找到進程的pid。 如果仍然無法卸載,請嘗試下一步。

第2步如果以上

運行Windows的自動搜索按名稱搜索服務並刪除結果。


發現另外一件事要檢查 - 看看任務管理器 - 如果其他用戶連接到這個盒子,即使他們是'斷開連接',你必須實際簽署它們才能使服務最終刪除。


看起來,在Windows 7之後的版本(未經驗證,但由Windows Server 2012 R2最新經驗),服務控制管理器(SCM)更為嚴格。

在Windows 7上它只是產生另一個進程,它現在正在檢查服務進程是否還在,並且可能返回ERROR_SERVICE_MARKED_FOR_DELETE(1072),以便後續調用CreateService / DeleteService,即使該服務似乎已停止。

我在這裡說的是Windows API代碼,但我想清楚地說明發生了什麼,所以這個序列可能會導致提到的錯誤:

SC_HANDLE hScm = OpenSCManager(nullptr, nullptr, SC_MANAGER_ALL_ACCESS);

SC_HANDLE hSvc = OpenService(hScm, L"Stub service", SERVICE_STOP | SERVICE_QUERY_STATUS | DELETE);

SERVICE_STATUS ss;
ControlService(hSvc, SERVICE_CONTROL_STOP, &ss);
// ... wait for service to report its SERVICE_STOPPED state

DeleteService(hSvc);
CloseServiceHandle(hSvc);
hSvc = nullptr;

// any further calls to CreateService/DeleteService will fail
// if service process is still around

在服務流程已經報告了其SERVICE_STOPPED狀態之後,服務流程仍然存在的原因並不奇怪。 這是一個常規進程,其主線程在對StartServiceCtrlDispatcher API的調用中“卡住”,因此它首先對停止控制動作作出反應,但必須執行其剩餘的代碼序列。

SCM / OS沒有為我們正確處理這個問題,這是一種不幸的事情。 程序化的解決方案相當簡單和準確:在停止服務之前獲取服務可執行文件的進程句柄,然後等待該句柄變成信號。

如果從系統管理角度來解決問題,解決方案也是等待服務過程完全消失。


這對我來說是有效的: - 我遇到了同樣的問題:我的服務被卡住了'標記為刪除'。 - 我打開services.msc我的服務確實顯示為正在運行,儘管它已被卸載。 - 我點擊停止接收到一條錯誤消息,表示該服務未處於接收控制消息的狀態。 儘管如此,該服務已經停止。 - 關閉services.msc。 - 重新打開services.msc。 - 服務不見了(不再顯示在服務列表中)。

(環境是Windows 7)


這意味著服務在services.msc中仍被列為禁用。 只需關閉services.msc並重新以管理員身份打開...該服務將不會被列出。 現在,使用該命令安裝該服務,

installutil“服務路徑”


關閉當前打開的每個窗口,然後運行以下命令為我解決了這個問題:

taskkill /F /IM mmc.exe






windows-services