サービスプログラムの自動起動を遅延実行に変更する

今回は、Windows のサービスプログラムの起動に関するネタです。
サービスプログラムにはスタートアップの種類として

  • 自動
  • 手動
  • 無効

と 3 つあるのはご存じでしょう。これが、Windows Vista / 2008 では、もう一つ

  • 自動(遅延開始)

という種類が追加されています。
どのような遅延方法なのかというと、通常の自動開始サービスの約 2 分後に開始されるというものです。
サービスマネージャーを開き、手動で設定することはできますが、今回は、プログラムで設定する方法を
紹介します。
恐らく、インストーラーパッケージ作成のオーサリングツールでは、ここまで対応していないと思うので
自前で処理する必要があると思います。そんなときに役立つでしょう。

具体的な方法ですが、ChangeServiceConfig2() を使い、SERVICE_DELAYED_AUTO_START_INFO 構造体で
情報を渡してあげるだけです。意外に簡単です。
注意点は、あくまでも "自動" 設定を "遅延" に変更するものであるため、既存の設定が "自動" に
なっている必要があるということです。

今回は、サンプルコードを作ったので載せておきます。

#define _WIN32_WINNT 0x0600

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

BOOL ChangeDelayedAutoStart(LPCTSTR lpszServiceName, bool bDelayed)
{
  BOOL bSuccess = TRUE;

  // SCM (Service Control Manager) に接続します

  SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
  if (hSCM == NULL)
  {
      printf("OpenSCManager failed (%d)\n", GetLastError());
      return FALSE;
  }
  // 設定するサービスプログラムのハンドルを取得します。

  SC_HANDLE hService = OpenService(
        hSCM,
        lpszServiceName,
        SERVICE_CHANGE_CONFIG);
  if (hService == NULL)
  {
      printf("OpenService failed (%d)\n", GetLastError());
      CloseServiceHandle(hSCM);
      return FALSE;
  }

  // 既存の自動起動を遅延実行に変更します。

  SERVICE_DELAYED_AUTO_START_INFO info = { bDelayed };

  if (ChangeServiceConfig2(
      hService,
      SERVICE_CONFIG_DELAYED_AUTO_START_INFO,
      &info))
  {
      printf("ChangeServiceConfig2 succeeded\n");
  }
  else
  {
      printf("ChangeServiceConfig2 failed (%d)\n", GetLastError());
      bSuccess = FALSE;
  }

  // サービスと SCM を閉じます

  CloseServiceHandle(hService);
  CloseServiceHandle(hSCM);

  return bSuccess;
}

サービスプログラムって、企業アプリケーションでは多いのですが、OS のサービス基盤ってあんまり変わっていないですね。
Windows Vista / 2008 では、サービス基盤に関して久々に変更が加えられたと思います。
過去、起動タイミングでトラブルがあるっていうサービスは、意外と多かったのではないでしょうか。
この自動遅延実行は、結構、使えるのではないでしょうか。


もう少しサービスプログラムの開発環境がしっかりしてくればいいのにっていつも思います。
サービスプログラムは作るのも難しいですし、デバッグも大変です。
それにも関わらず、開発ドキュメントは少なく、適当な造りになりがちです。(何となくでもビルドできてしまう)
"サービスプログラムでやってはいけないこと"って結構ありますからね。
("サービスプログラムでやってはいけないこと集"って作ったら、結構、喜ばれるかもしれません)
そして、何よりもフィールドトラブルの際には調査するのも大変ですよね。

質の良いサービスプログラムって、なかなかお目にかかることが少ないです…。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。