如何在安装服务后添加对 Windows 服务的依赖

Ric*_*ick 152 windows windows-service

我有一个使用 SQL Server 数据库的 Windows 服务。我无法控制服务的安装,但想添加对服务的依赖,以确保它在 SQL 服务器启动后启动。(SQL 服务器与相关服务在同一台机器上运行)

是否有工具可以添加依赖项或可能直接编辑注册表?

Kip*_*Kip 224

这也可以通过使用sc命令的提升的命令提示符来完成。语法是:

sc config [service name] depend= <Dependencies(separated by / (forward slash))>
Run Code Online (Sandbox Code Playgroud)

:有一个空间等号,有没有一个之前。

警告depend=参数将覆盖现有的依赖项列表,而不是追加。因此,例如,如果 ServiceA 已经依赖于 ServiceB 和 ServiceC,如果您运行depend= ServiceD,ServiceA 现在将依赖于 ServiceD。(谢谢马特!)

例子

对其他服务的依赖:

sc config ServiceA depend= ServiceB
Run Code Online (Sandbox Code Playgroud)

以上意味着 ServiceA 不会启动,直到 ServiceB 启动。如果停止ServiceB,ServiceA 将自动停止。

对多个其他服务的依赖:

sc config ServiceA depend= ServiceB/ServiceC/ServiceD/"Service Name With Spaces"
Run Code Online (Sandbox Code Playgroud)

上面的意思是,ServiceA 在 ServiceB、ServiceC 和 ServiceD 都启动后才会启动。如果您停止 ServiceB、ServiceC 或 ServiceD 中的任何一个,ServiceA 将自动停止。

要删除所有依赖项:

sc config ServiceA depend= /
Run Code Online (Sandbox Code Playgroud)

列出当前的依赖项:

sc qc ServiceA
Run Code Online (Sandbox Code Playgroud)

  • 如果使用 powershell,请确保使用 `sc.exe`,否则会出现错误:'找不到接受参数的位置参数' (8认同)
  • 如果您想在使用 Kip 的方法更改它们之前查看现有的依赖项,您可以键入 sc qc YourServiceName (6认同)
  • 如果像我一样,您的服务名称中有空格,请将其括在引号中。 (4认同)

pau*_*ska 42

您可以通过使用regedit命令将“DependOnService”值添加到注册表中的服务来添加服务依赖项,可以在 下找到服务HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>。详细信息可在MS KB 文章 193888 中找到,以下摘录自:

要创建新的依赖项,请选择代表要延迟的服务的子项,单击“编辑”,然后单击“添加值”。创建数据类型为 REG_MULTI_SZ 的新值名称“DependOnService”(不带引号),然后单击“确定”。出现“数据”对话框时,键入您希望在此服务之前启动的服务的名称,每行一个条目,然后单击“确定”。

  • 天啊!这是我收到的最快的答复。我几乎没有回到主页。 (8认同)

小智 5

我一直在寻找一种可以在 2008R2/Win7 及更高版本上工作的纯 PowerShell(无 regedit 或 sc.exe)方法,并提出了这个:

简单的一种方法是使用 PowerShell 进行注册表编辑:

Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\LanmanWorkstation' -Name DependOnService -Value @('Bowser','MRxSmb20','NSI')
Run Code Online (Sandbox Code Playgroud)

或者,使用 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)
Run Code Online (Sandbox Code Playgroud)

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[]
);
Run Code Online (Sandbox Code Playgroud)