SQL Serverデータベースを利用するWindowsサービスがあります。サービスのインストールを制御することはできませんが、サービスに依存関係を追加して、SQLサーバーの起動後に確実に起動するようにしたいと考えています。 (SQLサーバーは問題のサービスと同じマシンで実行されています)
依存関係を追加したり、レジストリを直接編集したりするためのツールはありますか?
これは、sc
コマンドを使用して管理者特権のコマンドプロンプトで行うこともできます。構文は次のとおりです。
sc config [service name] depend= <Dependencies(separated by / (forward slash))>
注:等号の後にスペースがあり、ないその前の1つ。
警告:depend=
パラメータは既存の依存関係リストをoverwriteします、追加しません。たとえば、ServiceAがすでにServiceBおよびServiceCに依存している場合、depend= ServiceD
を実行すると、ServiceAはServiceDにonlyを依存するようになります。 (ありがとう マット !)
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
regedit
コマンドを使用してレジストリのサービスに "DependOnService"値を追加することにより、サービスの依存関係を追加できます。サービスはHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>
の下にあります。詳細は MS KB記事193888 で確認できます。以下から抜粋します。
新しい依存関係を作成するには、遅延するサービスを表すサブキーを選択し、[編集]をクリックして、[値の追加]をクリックします。 REG_MULTI_SZのデータ型で新しい値の名前 "DependOnService"(引用符は除く)を作成し、[OK]をクリックします。 [データ]ダイアログボックスが表示されたら、このサービスの前に開始するサービスの名前を1行に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;
}