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


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

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


117
2018-06-12 14:52






答案:


这也可以通过使用提升的命令提示符来完成 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

180
2018-01-28 21:59



我最初选择了指示如何编辑注册表的答案。但是使用SC命令更符合我的要求。谢谢。 - Rick
如果要在使用Kip方法更改它们之前查看现有依赖项,可以键入sc qc YourServiceName - mivk
小心点......我只是使用了这个,并没有意识到它会覆盖现有的依赖关系..我的服务有两个我不记得了......现在它们已经消失了......哦,好吧!因此,请确保首先运行首先提到的@mivk命令以查看任何其他依赖项。 - Matt
如果像我一样,您的服务名称中包含空格,请将其括在引号中。 - Lazlow
如果使用PowerShell,请确保使用 sc.exe 否则你会得到错误:'找不到接受参数的位置参数' - spuder


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

要创建新的依赖项,请选择   表示服务的子键   想要延迟,单击编辑,然后   单击“添加值”。创建一个新值   名称“DependOnService”(没有   引号),数据类型为   REG_MULTI_SZ,然后单击“确定”。什么时候   出现“数据”对话框,键入   您的服务的名称或名称   喜欢在这项服务之前开始   每行一个条目,然后   单击确定。


41
2018-06-12 14:53



天啊!这是我收到的最快答案。我几乎没有回到主页。 - Rick
+1谢谢,为我工作。 - Rich


如果您感兴趣,我写了一个简单的.net应用程序来管理服务依赖项。免费。

http://webpages.charter.net/bushman4/servicedependencymanager.html


1
2018-01-31 16:38



它告诉我我需要.NET 1.1,但我正在运行Windows 7 - Nick
需要在Windows 7上安装.Net 1.1。请参阅此问题的答案: answers.microsoft.com/en-us/windows/forum/... - Glenn Sullivan
真的,在2014年你建议在Win7上安装.NET 1.1,而不是仅仅为4.0重新编译它?谢谢,不。 - Endrju


我正在寻找一个纯粹的PowerShell(没有regedit或sc.exe)方法,可以在2008R2 / Win7和更新版本上工作,并提出了这个:

使用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类的方法帮助指向了一个解决方案:

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[]
);

1
2018-02-13 03:40



经测试;效果很好。感谢分享。 - CJBS


在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;
}

0
2017-08-02 06:58