Як додати залежність від служби Windows ПІСЛЯ встановлення послуги


133

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

Чи є інструмент для додавання залежності або, можливо, редагування реєстру безпосередньо?

Відповіді:


199

Це також можна зробити через підвищений командний рядок за допомогою 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"

Вище означає, що ServiceA не запуститься до тих пір, поки ServiceB, ServiceC та ServiceD не запустяться. Якщо ви зупините будь-який з ServiceB, ServiceC або ServiceD, ServiceA зупиниться автоматично.

Щоб видалити всі залежності:

sc config ServiceA depend= /

Щоб перелічити поточні залежності:

sc qc ServiceA

5
Якщо ви хочете побачити існуючі залежності перед тим, як змінити їх методом Кіпа, ви можете набрати sc qc YourServiceName
mivk

1
Тільки будьте обережні ... Я просто використав це і не зрозумів, що це замінить існуючі залежності ... для моєї служби було два, яких я не пам'ятаю .. тепер вони пішли .. о добре! Тому переконайтеся, що ви запустите команду @mivk, згадану першою, щоб спочатку побачити будь-які інші залежності.
Метт,

1
Ви можете запитувати поточно налаштовану залежність для служби за допомогою sc qc [service name]команди
gerrytan

4
Якщо я, як я, у Вашій службі є пробіли в назві, додайте їх до лапок.
Лазлов

6
Якщо ви використовуєте powershell, переконайтеся, що в sc.exeіншому випадку ви отримаєте помилку: "Не можна знайти позиційний параметр, який приймає аргумент"
spuder

42

Ви можете додати залежності служби, додавши значення "DependOnService" до сервісу в реєстрі за допомогою regeditкоманди, служби можна знайти під HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>. Докладні відомості можна знайти в статті MS KB 193888 , з якої наведено нижче уривок:

Щоб створити нову залежність, виберіть підрозділ, який представляє послугу, яку ви хочете затримати, натисніть кнопку Редагувати та натисніть кнопку Додати значення. Створіть нову назву значення "DependOnService" (без лапок) з типом даних REG_MULTI_SZ і натисніть кнопку ОК. Коли з'явиться діалогове вікно "Дані", введіть назву або назви служб, які ви бажаєте запустити перед цією службою, одним записом для кожного рядка, а потім натисніть кнопку ОК.


7
Свята корова! Це була найшвидша відповідь, яку я коли-небудь отримав. Я ледве повернувся на головну сторінку.
Рік

2

Я шукав метод 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)

Метод Change класу 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

Я написав просту програму .net для управління залежностями сервісу, якщо вас цікавить. Це безкоштовно.

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


1
Це говорить мені, що мені потрібно .NET 1.1, але я запускаю Windows 7
Нік

1
.Net 1.1 потрібно встановити в Windows 7. Дивіться відповідь на це питання: answer.microsoft.com/en-us/windows/forum/…
Glenn Sullivan

9
Дійсно, у 2014 році ви рекомендували встановити .NET 1.1 на Win7, а не просто перекомпілювати його для 4.0? Спасибі, ні.
Endrju

0

У 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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.