WIn32API Windowsサービスの状態を取得する QueryServiceStatus

Windowsサービスの状態を取得するには、QueryServiceStatus関数を用いる。


QueryServiceStatus関数のプロトタイプは以下のとおり

BOOL QueryServiceStatus(
  SC_HANDLE hService,               // サービスのハンドル
  LPSERVICE_STATUS lpServiceStatus  // サービスのステータス
);


QueryServiceStatus関数の第二引数の型であるSERVICE_STATUS構造体は、WinSvc.h にて以下のように宣言されている。

typedef struct _SERVICE_STATUS {
  DWORD dwServiceType;
  DWORD dwCurrentState;
  DWORD dwControlsAccepted;
  DWORD dwWin32ExitCode;
  DWORD dwServiceSpecificExitCode;
  DWORD dwCheckPoint;
  DWORD dwWaitHint;
} SERVICE_STATUS, *LPSERVICE_STATUS;



特に主要な構造体メンバは、dwCurrentState、dwServiceTypeである。


dwCurrentStateは、現在のサービスの状態を表すDWORD型変数で、以下の値を取りうる

dwCurrentState説明
SERVICE_STOPPEDサービスが停止している
SERVICE_START_PENDINGサービスの開始が保留されている
SERVICE_STOP_PENDINGサービスの停止が保留されている
SERVICE_RUNNINGサービスは実行されている
SERVICE_CONTINUE_PENDINGサービスの続行が保留されている
SERVICE_PAUSE_PENDINGサービスの一時停止が保留されている
SERVICE_PAUSEDサービスが一時停止されている


dwServiceTypeは、サービスタイプを表し、以下の値を取りうる

dwServiceType説明
SERVICE_FILE_SYSTEM_DRIVERサービスはファイルシステムドライバー
SERVICE_KERNEL_DRIVERサービスはデバイスドライバ
SERVICE_WIN32_OWN_PROCESSサービスはその独自のプロセスで実行している
SERVICE_WIN32_SHARE_PROCESSサービスは他のサービスと1つのプロセスを共有している
SERVICE_INTERACTIVE_PROCESSサービスはデスクトップと対話可能である



  • DHCPサービス(DHCP Client)の状態を取得するサンプルプログラム
  • #include <windows.h>
    #include <stdio.h>
    
    void PrintCurrentStatus(DWORD dwCurrentState)
    {
        switch (dwCurrentState) {
    
            case SERVICE_STOPPED:
                puts("SERVICE_STOPPED");
                break;
    
            case SERVICE_START_PENDING:
                puts("SERVICE_START_PENDING");
                break;
    
            case SERVICE_STOP_PENDING:
                puts("SERVICE_STOP_PENDING");
                break;
    
            case SERVICE_RUNNING:
                puts("SERVICE_RUNNING");
                break;
    
            case SERVICE_CONTINUE_PENDING:
                puts("SERVICE_CONTINUE_PENDING");
                break;
    
            case SERVICE_PAUSE_PENDING:
                puts("SERVICE_PAUSE_PENDING");
                break;
    
            case SERVICE_PAUSED:
                puts("SERVICE_PAUSED");
                break;
    
            default:
                puts("Unkown State");
                break;
        }
    }
    
    void PrintServiceType(DWORD dwServiceType)
    {
        switch (dwServiceType) {
        case SERVICE_FILE_SYSTEM_DRIVER:
            puts("SERVICE_FILE_SYSTEM_DRIVER");
            break;
    
        case SERVICE_KERNEL_DRIVER:
            puts("SERVICE_KERNEL_DRIVER");
            break;
    
        case SERVICE_WIN32_OWN_PROCESS:
            puts("SERVICE_WIN32_OWN_PROCESS");
            break;
    
        case SERVICE_WIN32_SHARE_PROCESS:
            puts("SERVICE_WIN32_SHARE_PROCESS");
            break;
    
        case SERVICE_INTERACTIVE_PROCESS:
            puts("SERVICE_INTERACTIVE_PROCESS");
            break;
    
        default:
            puts("Unknown service type");
            break;
        }
    }
    
    int main()
    {
        SC_HANDLE hSCM;
        SC_HANDLE hService;
        SERVICE_STATUS ServiceStatus;
        LPCTSTR lpszServiceName = TEXT("Dhcp");
    
        hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
        if (hSCM == NULL) {
            return 1;
        }
    
        hService = OpenService(hSCM, lpszServiceName, SERVICE_QUERY_STATUS);
        if (hService == NULL) {
            return 1;//goto
        }
    
        //サービスの状態を取得する
        if (QueryServiceStatus(hService, &ServiceStatus)) {
        
            PrintCurrentStatus(ServiceStatus.dwCurrentState);
    
            PrintServiceType(ServiceStatus.dwServiceType);
    
        } else {
            printf("QueryServiceStatus error: %d\n", GetLastError());
        }
    
        CloseServiceHandle(hService);
        CloseServiceHandle(hSCM);
    
        return 0;
    }


  • 実行結果: DHCPクライアントサービスは実行中で、1つのプロセスを他のサービスと共有している
  • SERVICE_RUNNING
    SERVICE_WIN32_SHARE_PROCESS


  • 参考

  • http://msdn.microsoft.com/ja-jp/library/cc429299.aspx
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms685996(v=vs.85).aspx