我有一个使用 SQL Server 数据库的 Windows 服务。我无法控制服务的安装,但想添加对该服务的依赖关系,以确保它在 SQL Server 启动后启动。(SQL Server 与相关服务在同一台计算机上运行)
是否有工具可以添加依赖项或者直接编辑注册表?
答案1
也可以通过提升的命令提示符使用sc
命令来完成此操作。语法为:
sc config [service name] depend= <Dependencies(separated by / (forward slash))>
笔记:有一个空格后等号,还有不是之前有一个。
警告:depend=
参数将覆写现有依赖项列表,而不是附加。例如,如果 ServiceA 已经依赖于 ServiceB 和 ServiceC,则如果您运行depend= ServiceD
,ServiceA 现在将依赖仅有的在 ServiceD 上。(感谢马特!
例子
依赖于另一项服务:
sc config ServiceA depend= ServiceB
上面的意思是 ServiceA 只有在 ServiceB 启动后才会启动。如果你停止 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
答案2
您可以使用命令在注册表中为服务添加“DependOnService”值来添加服务依赖项regedit
,服务可以在 下找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>
。详细信息可以在以下位置找到:MS 知识库文章 193888,以下是其中的摘录:
要创建新的依赖关系,请选择代表要延迟的服务的子项,单击“编辑”,然后单击“添加值”。创建一个新值名称“DependOnService”(不带引号),数据类型为 REG_MULTI_SZ,然后单击“确定”。出现“数据”对话框时,键入您希望在此服务之前启动的服务的名称(每行一个条目),然后单击“确定”。
答案3
我正在寻找一种可以在 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 类的方法有助于指出解决方案:
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[]
);
答案4
在 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;
}