Win32 Windowsサービスを制御する ControlService

Windowsサービスの状態を制御するには、ControlService関数を用いる。


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

BOOL ControlService(
  SC_HANDLE hService,               // サービスのハンドル
  DWORD dwControl,                  // 制御コード
  LPSERVICE_STATUS lpServiceStatus  // ステータス情報
);


  • ControlService関数の使用例として、「iPod Service」を停止するプログラムを以下に示す。

  • #include <windows.h>
    #include <stdio.h>
    
    int main()
    {
        SC_HANDLE hSCM = NULL;
        SC_HANDLE hService = NULL;
        SERVICE_STATUS ServiceStatus;
        LPCTSTR lpszServiceName = TEXT("iPod Service");
    
        hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
        if (hSCM == NULL) {
            printf("OpenSCManager error: %d\n", GetLastError());
            goto EXIT_FUNC;
        }
    
        //ControlService関数でサービスを停止するためには、OpenService関数で、
        //SERVICE_STOPアクセス権を持つサービスハンドルを取得する必要がある。
        hService = OpenService(hSCM,
            lpszServiceName,
            SERVICE_STOP);
    
        if (hService == NULL) {
            printf("OpenService error: %d\n", GetLastError());
            goto EXIT_FUNC;
        }
    
        //サービスを停止するためには、第2引数に SERVICE_CONTROL_STOP を指定する。
        if (ControlService(hService, SERVICE_CONTROL_STOP, &ServiceStatus)) {
            printf("Success\n");
        } else {
            printf("OpenService error: %d\n", GetLastError());
        }
    
    
    EXIT_FUNC:
    
        CloseServiceHandle(hSCM);
        CloseServiceHandle(hService);
    
        return 0;
    }



    注意:このプログラムを実行するためには、管理者権限が必要になる。実行ファイルを右クリックし、ポップアップで「管理者として実行(A)...」を選択して実行する。管理者のパスワードを求められることもある。





  • 参考

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