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


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

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


114
2018-06-12 14:52


Источник




Ответы:


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

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

Заметка: Есть пробел после знак равенства, и есть не один перед ним.

Предупреждение: depend= параметр будет затирать существующий список зависимостей, а не добавление. Например, если ServiceA уже зависит от ServiceB и ServiceC, если вы запускаете depend= ServiceD, ServiceA теперь будет зависеть только на 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

177
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, а затем нажмите OK. когда   появится диалоговое окно «Данные», введите   имя или имена служб, которые вы   предпочитают начинать до этой службы   с одной записью для каждой строки, а затем   нажмите «ОК».


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
.Net 1.1 необходимо установить в Windows 7. См. Ответ на этот вопрос: answers.microsoft.com/en-us/windows/forum/... - Glenn Sullivan
Действительно, в 2014 году вы рекомендовали установить .NET 1.1 на Win7 вместо того, чтобы просто перекомпилировать его для 4.0? Спасибо, нет. - Endrju


Я искал метод 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','') #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