it-swarm.cn

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

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

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

135
Rick

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

sc config [service name] depend= <Dependencies(separated by / (forward slash))>

注意:空格after等号,而空格前not

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

例子

对其他服务的依赖:

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
203
Kip

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

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

42
pauska

我一直在寻找可以在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[]
);
2
JoeGasper

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

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

1
Glenn Sullivan

在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
AndersK