WIn32API サービスの状態を列挙する EnumServicesStatus

Windowsサービスの状態を列挙するには、EnumServiceStatus関数を用いる。


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

BOOL EnumServicesStatus(
  SC_HANDLE hSCManager,             // SCM データベースのハンドル
  DWORD dwServiceType,              // サービスタイプ
  DWORD dwServiceState,             // サービスの状態
  LPENUM_SERVICE_STATUS lpServices, // ステータスバッファ
  DWORD cbBufSize,                  // ステータスバッファのサイズ
  LPDWORD pcbBytesNeeded,           // 必要なバッファサイズ
  LPDWORD lpServicesReturned,       // 返されたエントリの数
  LPDWORD lpResumeHandle            // 次のエントリ
);



第二引数のdwServiceTypeには、どのようなタイプのサービスを列挙するかを指定する。指定できる値は以下のとおり

説明
SERVICE_WIN32SERVICE_WIN32_OWN_PROCESS とSERVICE_WIN32_SHARE_PROCESS を列挙する
SERVICE_DRIVERSERVICE_KERNEL_DRIVER と SERVICE_FILE_SYSTEM_DRIVER を列挙する



  • EnumServiceStatusのサンプルプログラム
  • #include <windows.h>
    #include <stdio.h>
    #include <locale.h>
    
    const TCHAR *GetCurrentStateString(DWORD dwCurrentState)
    {
        switch (dwCurrentState) {
    
            case SERVICE_STOPPED:
                return TEXT("SERVICE_STOPPED");
    
            case SERVICE_START_PENDING:
                return TEXT("SERVICE_START_PENDING");
    
            case SERVICE_STOP_PENDING:
                return TEXT("SERVICE_STOP_PENDING");
    
            case SERVICE_RUNNING:
                return TEXT("SERVICE_RUNNING");
    
            case SERVICE_CONTINUE_PENDING:
                return TEXT("SERVICE_CONTINUE_PENDING");
    
            case SERVICE_PAUSE_PENDING:
                return TEXT("SERVICE_PAUSE_PENDING");
    
            case SERVICE_PAUSED:
                return TEXT("SERVICE_PAUSED");
    
            default:
                return TEXT("Unkown State");
    
        }
    }
    
    const TCHAR *GetServiceTypeString(DWORD dwServiceType)
    {
        switch (dwServiceType) {
    
        case SERVICE_FILE_SYSTEM_DRIVER:
            return TEXT("SERVICE_FILE_SYSTEM_DRIVER");
    
        case SERVICE_KERNEL_DRIVER:
            return TEXT("SERVICE_KERNEL_DRIVER");
    
        case SERVICE_WIN32_OWN_PROCESS:
            return TEXT("SERVICE_WIN32_OWN_PROCESS");
    
        case SERVICE_WIN32_SHARE_PROCESS:
            return TEXT("SERVICE_WIN32_SHARE_PROCESS");
        
        case SERVICE_INTERACTIVE_PROCESS:
            return TEXT("SERVICE_INTERACTIVE_PROCESS");
    
        default:
            return TEXT("Unknown service type");
    
        }
    }
    
    int main()
    {
        SC_HANDLE hSCM;
        LPENUM_SERVICE_STATUS lpEnumServiceStatus;
        DWORD dwBytesNeeded;
        DWORD dwServicesReturned;
        DWORD i;
    
        setlocale(LC_ALL, setlocale(LC_CTYPE, ""));
    
        hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
    
    
        //サービスの状態を格納するために必要なメモリサイズ(Byte)をdwBytesNeededに取得する
        ::EnumServicesStatus(hSCM, 
            SERVICE_WIN32 | SERVICE_DRIVER,
            SERVICE_STATE_ALL,
            NULL,
            0,
            &dwBytesNeeded,
            &dwServicesReturned,
            0);
    
        //サービスの状態を格納するためのメモリを確保する
        lpEnumServiceStatus = (LPENUM_SERVICE_STATUS)LocalAlloc(LPTR, dwBytesNeeded);
        if (lpEnumServiceStatus == NULL) {
            return 1;
        }
    
        //サービスの状態を取得する
        EnumServicesStatus(hSCM, 
            SERVICE_WIN32 | SERVICE_DRIVER, //すべてのサービスのタイプを取得する
            SERVICE_STATE_ALL,
            lpEnumServiceStatus,
            dwBytesNeeded,
            &dwBytesNeeded,
            &dwServicesReturned,
            0);
    
        for (i = 0; i < dwServicesReturned; i++) {
    
            wprintf(L"------------------------------------------\n");
            
            //表示名
            _tprintf(TEXT("DisplayName: %s\n"), 
                lpEnumServiceStatus[i].lpDisplayName);
            
            //サービス名
            _tprintf(TEXT("ServiceName: %s\n"), 
                lpEnumServiceStatus[i].lpServiceName);
            
            //現在の状態
            _tprintf(TEXT("CurrentState: %s\n"), 
                GetCurrentStateString(lpEnumServiceStatus[i].ServiceStatus.dwCurrentState));
    
            //サービスタイプ
            _tprintf(TEXT("ServiceType: %s\n"), 
                GetServiceTypeString(lpEnumServiceStatus[i].ServiceStatus.dwServiceType));
            
            printf("\n");
        }
    
        LocalFree(lpEnumServiceStatus);
        CloseServiceHandle(hSCM);
    
        return 0;
    }


  • 実行結果
  • ------------------------------------------
    DisplayName: 1394 OHCI Compliant Host Controller
    ServiceName: 1394ohci
    CurrentState: SERVICE_STOPPED
    ServiceType: SERVICE_KERNEL_DRIVER
    
    ------------------------------------------
    DisplayName: Microsoft ACPI Driver
    ServiceName: ACPI
    CurrentState: SERVICE_RUNNING
    ServiceType: SERVICE_KERNEL_DRIVER
    
    ------------------------------------------
    DisplayName: ACPI 電源メーター ドライバー
    ServiceName: AcpiPmi
    CurrentState: SERVICE_STOPPED
    ServiceType: SERVICE_KERNEL_DRIVER
    
    ------------------------------------------
    DisplayName: Adobe Acrobat Update Service
    ServiceName: AdobeARMservice
    CurrentState: SERVICE_RUNNING
    ServiceType: SERVICE_WIN32_OWN_PROCESS
    
    ------------------------------------------
    DisplayName: adp94xx
    ServiceName: adp94xx
    CurrentState: SERVICE_STOPPED
    ServiceType: SERVICE_KERNEL_DRIVER
    
    
    (さらに続く)


  • 参考

  • http://msdn.microsoft.com/ja-jp/library/cc429097.aspx