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

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

我有一个使用 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;
}

相关内容