Как добавить зависимость от службы Windows ПОСЛЕ установки службы

У меня есть служба Windows, которая использует базу данных SQL Server. Я не контролирую установку службы, но хотел бы добавить зависимость от службы, чтобы она начиналась после запуска SQL-сервера. (SQL-сервер работает на том же компьютере, что и соответствующая служба)

Есть ли инструмент для добавления зависимостей или, возможно, редактирования реестра напрямую?

113 голосов | спросил Rick 12 J0000006Europe/Moscow 2009, 18:52:00

5 ответов


177

Это также можно выполнить с помощью командной строки с повышенными правами с помощью команды sc . Синтаксис:

  sc config [имя службы] depend = <Зависимости (разделенные /(прямая косая черта))>
 

Примечание . Значок равенства после имеет пробел , а перед ним есть not .

Предупреждение : depend = будет перезаписывать список существующих зависимостей, а не добавлять. Например, если ServiceA уже зависит от ServiceB и ServiceC, если вы запустите depend = ServiceD , ServiceA теперь будет зависеть только от ServiceD. (Спасибо Мэтт !)

Примеры

Зависимость от другой службы:

  sc config ServiceA depend = ServiceB
 

Выше означает, что ServiceA не запустится, пока не запустится ServiceB. Если вы остановите ServiceB, ServiceA автоматически остановится.

Зависимость от нескольких других сервисов:

  sc config ServiceA depend = ServiceB /ServiceC /ServiceD /"Имя службы с пробелами"
 

Выше означает, что ServiceA не запустится, пока не запустится ServiceB, ServiceC и ServiceD. Если вы остановите любой из ServiceB, ServiceC или ServiceD, ServiceA автоматически остановится.

Чтобы удалить все зависимости:

  sc config ServiceA depend = /
 

Чтобы просмотреть текущие зависимости:

  sc qc ServiceA
 
ответил Kip 29 Jam1000000amSat, 29 Jan 2011 00:59:45 +030011 2011, 00:59:45
41

Вы можете добавить сервисные зависимости, добавив значение «DependOnService» к службе в реестре с помощью команды regedit , службы можно найти в HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ & lt ; Имя службы> . Подробности можно найти в статье MS KB 193888 , из которой следующее выдержка из:

  

Чтобы создать новую зависимость, выберите   подраздел, представляющий службу, которую вы   хотите отложить, нажмите «Изменить», а затем   нажмите «Добавить значение». Создать новое значение   имя «DependOnService» (без   кавычки) с типом данных   REG_MULTI_SZ, а затем нажмите OK. когда   появится диалоговое окно «Данные», введите   имя или имена служб, которые вы   предпочитают начинать до этой службы   с одной записью для каждой строки, а затем   нажмите «ОК».

ответил pauska 12 J0000006Europe/Moscow 2009, 18:53:42
1

Я написал простое .net-приложение для управления зависимостями службы, если вам интересно. Это бесплатно.

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

ответил Glenn Sullivan 31 Jpm1000000pmThu, 31 Jan 2013 20:38:15 +040013 2013, 20:38:15
1

Я искал метод PowerShell (без regedit или sc.exe), который может работать на 2008R2 /Win7 и новее, и придумал следующее:

Легкий - это сделать regedit с PowerShell:

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

Или, используя WMI:

  $ DependsOn = @ ('Bowser', 'MRxSmb20', 'NSI', '') # содержать пустой элемент массива в конце
$ svc = Get-WmiObject win32_Service -filter "Name = 'LanmanWorkstation'"
$ Svc.Change ($ нуль, $ нуль, $ нуль, $ нуль, $ нуль, $ нуль, $ нуль, $ нуль, $ нуль, $ нуль, $ DependsOn)
 

Изменить метод класс Win32_Service помог указать на решение:

  uint32 Изменить (
[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] строка ServiceDependencies []
);
 
ответил JoeGasper 13 FebruaryEurope/MoscowbMon, 13 Feb 2017 06:40:37 +0300000000amMon, 13 Feb 2017 06:40:37 +030017 2017, 06:40:37
0

В C ++ (ATL) мне это понравилось

  bool ModifyDependOnService (void)
{
  CRegKey R;
  if (ERROR_SUCCESS == R.Open (HKEY_LOCAL_MACHINE, L "SYSTEM \\ CurrentControlSet \\ services \\ MyService"))
  {
    bool depIsThere = false;

    //определите, установлен ли другой сервис, если да, а затем добавьте в список зависимостей.
    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";
    если (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;
}
 
ответил Anders K. 2 AM00000090000000631 2018, 09:58:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132