web-dev-qa-db-ja.com

サービスのインストール後にWindowsサービスへの依存関係を追加する方法

SQL Serverデータベースを利用するWindowsサービスがあります。サービスのインストールを制御することはできませんが、サービスに依存関係を追加して、SQLサーバーの起動後に確実に起動するようにしたいと考えています。 (SQLサーバーは問題のサービスと同じマシンで実行されています)

依存関係を追加したり、レジストリを直接編集したりするためのツールはありますか?

135
Rick

これは、scコマンドを使用して管理者特権のコマンドプロンプトで行うこともできます。構文は次のとおりです。

sc config [service name] depend= <Dependencies(separated by / (forward slash))>

:等号の後にスペースがありないその前の1つ。

警告depend=パラメータは既存の依存関係リストをoverwriteします、追加しません。たとえば、ServiceAがすでにServiceBおよびServiceCに依存している場合、depend= ServiceDを実行すると、ServiceAはServiceDにonlyを依存するようになります。 (ありがとう マット !)

他の1つのサービスへの依存:

sc config ServiceA depend= ServiceB

上記は、ServiceBが開始するまでServiceAが開始しないことを意味します。 ServiceBを停止すると、ServiceAは自動的に停止します。

他の複数のサービスへの依存:

sc config ServiceA depend= ServiceB/ServiceC/ServiceD/"Service Name With Spaces"

上記は、ServiceA、ServiceB、ServiceC、およびServiceDがすべて開始されるまで開始されないことを意味します。 ServiceB、ServiceC、ServiceDのいずれかを停止すると、ServiceAは自動的に停止します。

すべての依存関係を削除するには:

sc config ServiceA depend= /

現在の依存関係を一覧表示するには:

sc qc ServiceA
203
Kip

regeditコマンドを使用してレジストリのサービスに "DependOnService"値を追加することにより、サービスの依存関係を追加できます。サービスはHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>の下にあります。詳細は MS KB記事193888 で確認できます。以下から抜粋します。

新しい依存関係を作成するには、遅延するサービスを表すサブキーを選択し、[編集]をクリックして、[値の追加]をクリックします。 REG_MULTI_SZのデータ型で新しい値の名前 "DependOnService"(引用符は除く)を作成し、[OK]をクリックします。 [データ]ダイアログボックスが表示されたら、このサービスの前に開始するサービスの名前を1行に1つずつ入力し、[OK]をクリックします。

42
pauska

私は2008R2/Win7以降で動作する純粋なPowerShell(regeditまたはsc.exeなし)メソッドを探していて、これを思いつきました:

簡単なのは、PowerShellでregeditを実行することです。

Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\LanmanWorkstation' -Name DependOnService -Value @('Bowser','MRxSmb20','NSI')

または、WMIを使用します。

$DependsOn = @('Bowser','MRxSmb20','NSI','') #keep the empty array element at end
$svc = Get-WmiObject win32_Service -filter "Name='LanmanWorkstation'"
$svc.Change($null,$null,$null,$null,$null,$null,$null,$null,$null,$null,$DependsOn)

Win32_Serviceクラスの Change メソッドは、解決策を示すのに役立ちました。

uint32 Change(
[in] string  DisplayName,
[in] string  PathName,
[in] uint32  ServiceType,
[in] uint32  ErrorControl,
[in] string  StartMode,
[in] boolean DesktopInteract,
[in] string  StartName,
[in] string  StartPassword,
[in] string  LoadOrderGroup,
[in] string  LoadOrderGroupDependencies[],
[in] string  ServiceDependencies[]
);
2
JoeGasper

興味があれば、サービスの依存関係を管理する簡単な.netアプリケーションを作成しました。それは無料です。

http://webpages.charter.net/bushman4/servicedependencymanager.html

1
Glenn Sullivan

C++(ATL)では私はこのようにしました

bool ModifyDependOnService(void)
{
  CRegKey R;
  if (ERROR_SUCCESS == R.Open(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\services\\MyService"))
  {
    bool depIsThere = false;

    // determine if otherservice is installed, if yes, then add to dependency list.
    SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
    if (hSCManager)
    {
      SC_HANDLE hService = OpenService(hSCManager, L"OtherService", SERVICE_QUERY_STATUS);
      if (hService)
      {
        depIsThere = true;
        CloseServiceHandle(hService);
      }
      CloseServiceHandle(hSCManager);
    }

    std::wstring key = L"DependOnService";
    if (depIsThere )
    {
      const wchar_t deps[] = L"RPCSS\0OtherService\0";
      R.SetValue(key.c_str(), REG_MULTI_SZ, deps, sizeof(deps));
    }

    R.Close();
    return true;
  }
  return false;
}
0
AndersK