【 タスクスケジューラサービスの起動 ( WindowsNT ) 】

1. OpenSCManager
2. OpenService
3. ソースコード

  • 指定されたコンピューター上のサービスコントロールマネージャーへの接続を確立し、指定された
    サービスコントロールマネージャーデータベースを開きます
  • Syntax
     
    SC_HANDLE OpenSCManager(
      LPCTSTR lpMachineName,
      LPCTSTR lpDatabaseName,
      DWORD dwDesiredAccess
    );
    


  • lpMachineName
  • NULLで終了するコンピュータの名前(文字列)へのポインタ
  • NULL の場合は、ローカルコンピューター上のサービスコントロールマネージャーに接続します

  • lpDatabaseName
  • NULLで終了するサービスコントロールマネージャーデータ・ベースの名前(文字列)へのポインタ
  • このパラメーターは SERVICES_ACTIVE_DATABASEにセットされるべきです
    NULLの場合、SERVICES_ACTIVE_DATABASEデータベースがデフォルトです

  • dwDesiredAccess
  • Administrator ならば SC_MANAGER_ALL_ACCESS を指定して下さい
  • SC_MANAGER_CONNECTアクセス権は、この関数を呼ぶことにより暗黙に指定されます
  • Syntax
     
    SC_HANDLE OpenService(
      SC_HANDLE hSCManager,
      LPCTSTR lpServiceName,
      DWORD dwDesiredAccess
    );
    


  • hSCManager
  • OpenSCManagerで取得したハンドルを指定します

  • lpServiceName
  • 256バイト以内のNULLで終了するサービスの名前(文字列)へのポインタ

  • dwDesiredAccess
  • 以下を参照して下さい
  •   パラメータ 内容
    1
    SERVICE_ALL_ACCESS
    すべてのアクセス権に加えて
    STANDARD_RIGHTS_REQUIREDを
    含んでいます
    2
    SERVICE_CHANGE_CONFIG
    ChangeServiceConfigまたは
    ChangeServiceConfig2を使用して
    サービスのの定義変更を行なう
    3
    SERVICE_ENUMERATE_DEPENDENTS
    EnumDependentServices関数
    でサービスに依存する全ての
    サービスを列挙する
    4
    SERVICE_INTERROGATE
    ControlService 関数を使用
    して直ちに状態を知る
    5
    SERVICE_PAUSE_CONTINUE
    ControlService 関数を使用して
    サービスを一時停止または継続させる
    6
    SERVICE_QUERY_CONFIG
    QueryServiceConfig と 
    QueryServiceConfig2 関数でサービス
    の定義を問い合わせる
    7
    SERVICE_QUERY_STATUS
    QueryServiceStatus でサービス
    コントロールマネージャにサービス
    の状態を問い合わせる
    8
    SERVICE_START
    StartService でサービスを
    開始する
    9
    SERVICE_STOP
    ControlService でサービスを
    停止する
    10
    SERVICE_USER_DEFINED_CONTROL
    ControlService でユーザに定義
    されたコントロールコードを
    指定してください


    #include <windows.h>
     
    void StartScheduler( void )
    {
    	SC_HANDLE   hSC		= NULL;
    	SC_HANDLE   hSchSvc	= NULL;
     
    	// サービスマネージャへの接続
    	hSC = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
    	if ( hSC == NULL ) {
    		return;
    	}
     
    	// サービスの開始とステータスの取得を前提とした
    	// サービスハンドルの取得
    	hSchSvc = OpenService(
    			hSC,
    			"Schedule",
    			SERVICE_START | SERVICE_QUERY_STATUS
    		);
     
    	// サービスマネージャの切断
    	CloseServiceHandle( hSC );
     
    	if ( hSchSvc == NULL ) {
    		return;
    	}
     
    	SERVICE_STATUS SvcStatus;
     
    	// ステータスの取得
    	if ( QueryServiceStatus( hSchSvc, &SvcStatus ) == FALSE ) {
    		CloseServiceHandle( hSchSvc );
    		return;
    	}
     
    	// 実行中かどうかの確認
    	if ( SvcStatus.dwCurrentState == SERVICE_RUNNING ) {
    		CloseServiceHandle( hSchSvc );
    		return;
    	}
     
    	// サービスの開始
    	if ( StartService( hSchSvc, 0, NULL ) == FALSE ) {
    		CloseServiceHandle( hSchSvc );
    		return;
    	}
     
    	// サービスハンドルのクローズ
    	CloseServiceHandle( hSchSvc );
     
    }