Windows 服務控制管理器 (SCM) 提供一組 API 供應用程式管理服務生命週期。關鍵函數包括:
OpenSCManager — 打開服務控制管理器資料庫OpenService — 獲取特定服務的句柄StartService — 啟動服務ControlService — 發送控制碼(停止、暫停、繼續等)QueryServiceStatus — 查詢服務當前狀態#include <windows.h>
#include <stdio.h>
BOOL ControlServiceExample(const char* svcName) {
SC_HANDLE scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (!scm) {
printf("OpenSCManager 失敗: %lu\n", GetLastError());
return FALSE;
}
SERVICE_STATUS status = {0};
SC_HANDLE svc = NULL;
BOOL result = FALSE;
// ---------- 1. 啟動服務 ----------
svc = OpenService(scm, svcName, SERVICE_START);
if (svc) {
if (StartService(svc, 0, NULL)) {
printf("服務啟動請求已發送\n");
result = TRUE;
} else {
printf("StartService 失敗: %lu\n", GetLastError());
}
CloseServiceHandle(svc);
}
// ---------- 2. 停止服務 ----------
svc = OpenService(scm, svcName, SERVICE_STOP | SERVICE_QUERY_STATUS);
if (svc) {
if (QueryServiceStatus(svc, &status)) {
if (status.dwCurrentState == SERVICE_RUNNING ||
status.dwCurrentState == SERVICE_PAUSED) {
if (ControlService(svc, SERVICE_CONTROL_STOP, &status)) {
printf("服務停止請求已發送\n");
result = TRUE;
}
}
}
CloseServiceHandle(svc);
}
// ---------- 3. 暫停服務 ----------
svc = OpenService(scm, svcName, SERVICE_PAUSE_CONTINUE | SERVICE_QUERY_STATUS);
if (svc) {
if (QueryServiceStatus(svc, &status)) {
if (status.dwCurrentState == SERVICE_RUNNING) {
if (ControlService(svc, SERVICE_CONTROL_PAUSE, &status)) {
printf("服務暫停請求已發送\n");
result = TRUE;
}
}
}
CloseServiceHandle(svc);
}
// ---------- 4. 繼續服務 ----------
svc = OpenService(scm, svcName, SERVICE_PAUSE_CONTINUE | SERVICE_QUERY_STATUS);
if (svc) {
if (QueryServiceStatus(svc, &status)) {
if (status.dwCurrentState == SERVICE_PAUSED) {
if (ControlService(svc, SERVICE_CONTROL_CONTINUE, &status)) {
printf("服務繼續請求已發送\n");
result = TRUE;
}
}
}
CloseServiceHandle(svc);
}
CloseServiceHandle(scm);
return result;
}
| 項目 | 說明 |
|---|---|
| 服務名稱 vs 顯示名稱 | API 需要服務名稱(如 wuauserv),非顯示名稱(如 "Windows Update") |
| 權限要求 | 需管理員權限;SCM 句柄需 SC_MANAGER_ALL_ACCESS 或對應權限 |
| 狀態檢查 | 發送控制碼前務必用 QueryServiceStatus 確認當前狀態,避免無效操作 |
| 異步特性 | ControlService 為異步請求,返回 TRUE 僅表示請求已接受,非操作完成 |
| 資源釋放 | 每個 OpenService 產生的句柄必須配對 CloseServiceHandle |
SERVICE_STOPPED 0x00000001
SERVICE_START_PENDING 0x00000002
SERVICE_STOP_PENDING 0x00000003
SERVICE_RUNNING 0x00000004
SERVICE_CONTINUE_PENDING 0x00000005
SERVICE_PAUSE_PENDING 0x00000006
SERVICE_PAUSED 0x00000007
GetLastError() 並提供用戶友好提示