Answers:
这也可以通过使用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"
以上表示ServiceA将在ServiceB,ServiceC和ServiceD全部启动后才能启动。如果停止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,以下摘录自:
若要创建新的依赖关系,请选择代表要延迟的服务的子项,单击“编辑”,然后单击“添加值”。创建一个新的值名称“ DependOnService”(不带引号),其数据类型为REG_MULTI_SZ,然后单击“确定”。当出现“数据”对话框时,键入您希望在该服务之前启动的服务的名称,并在每一行中输入一个条目,然后单击“确定”。
我一直在寻找可以在2008R2 / Win7及更高版本上运行的纯PowerShell方法(无regedit或sc.exe),并提出了以下建议:
简单的一种是使用PowerShell进行注册表编辑:
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;
}