回答:
これは、sc
コマンドを使用して管理者特権のコマンドプロンプト経由でも実行できます。構文は次のとおりです。
sc config [service name] depend= <Dependencies(separated by / (forward slash))>
注:等号の後にスペースがあり、その前にスペースはありません。
警告:depend=
パラメーターは、追加ではなく、既存の依存関係リストを上書きします。たとえば、ServiceAがすでにServiceBとServiceCに依存している場合、実行するとdepend= ServiceD
、ServiceAはServiceD のみに依存するようになります。(マットに感謝!)
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
sc qc [service name]
コマンド
sc.exe
それ以外の場合は、エラーが発生します。「引数を受け入れる位置パラメーターが見つかりません」
regedit
コマンドを使用してレジストリのサービスに「DependOnService」値を追加することにより、サービスの依存関係を追加できますHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>
。サービスはの下にあります。詳細については、MS KB記事193888を参照してください。以下からの抜粋です。
新しい依存関係を作成するには、遅延するサービスを表すサブキーを選択し、[編集]、[値の追加]の順にクリックします。データ型がREG_MULTI_SZである新しい値名「DependOnService」(引用符なし)を作成し、[OK]をクリックします。[データ]ダイアログボックスが表示されたら、このサービスの前に開始するサービスの名前を各行に1つずつ入力して、[OK]をクリックします。
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[]
);
興味のある方は、サービスの依存関係を管理する簡単な.netアプリケーションを作成しました。それは無料です。
http://webpages.charter.net/bushman4/servicedependencymanager.html
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;
}