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


133

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

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

回答:


199

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

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

:等号のにスペースがあり、その前にスペースはありません

警告depend=パラメーターは、追加ではなく、既存の依存関係リストを上書きします。たとえば、ServiceAがすでにServiceBとServiceCに依存している場合、実行するとdepend= ServiceD、ServiceAはServiceD のみに依存するようになります。(マットに感謝!)

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

sc config ServiceA depend= ServiceB

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

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

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

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

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

sc config ServiceA depend= /

現在の依存関係をリストするには:

sc qc ServiceA

5
Kipのメソッドで変更する前に既存の依存関係を確認するには、sc qc YourServiceName
mivk

1
ただ注意してください...私はこれを使用しただけで、既存の依存関係を上書きすることに気づきませんでした。私のサービスには覚えていないものが2つありました..今は消えました.. そのため、最初に言及したコマンド@mivkを最初に実行して、他の依存関係を最初に確認してください。
マット

1
sc qc [service name]コマンド
-gerrytan

4
私のように、サービスの名前にスペースが含まれている場合は、引用符で囲んでください。
ラズロー14年

6
powershellを使用している場合は、必ず使用してください。sc.exeそれ以外の場合は、エラーが発生します。「引数を受け入れる位置パラメーターが見つかりません」
-spuder

42

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

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


7
聖なる牛!それは私がこれまでに受け取った最速の答えでした。私はかろうじてホームページに戻りました。
リック

2

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[]
);

1

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

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


1
私は.NET 1.1が必要だと言っていますが、Windows 7を実行しています
ニック14年

1
.Net 1.1はWindows 7にインストールする必要があります。この質問に対する回答をご覧ください。answers.microsoft.com
グレンサリバン14年

9
本当に、2014年に.NET 1.1を4.0用に再コンパイルするのではなく、Win7にインストールすることをお勧めしていましたか?ありがと
エンドルジュ

0

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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.