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

Для документации и одних только блогов, необходимо запустить с http://www.ToadWorld.com.

134
задан 22 September 2009 в 17:42
5 ответов

Это может также быть сделано через поднятую командную строку с помощью 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
200
ответ дан 28 November 2019 в 19:18

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

Для создания новой зависимости выберите подраздел, представляющий сервис, Вы хотите задержать, нажать Edit и затем нажать Add Value. Создайте новое имя значения "DependOnService" (без кавычек) с типом данных REG_MULTI_SZ и затем нажмите "OK". Когда диалоговое окно Data появляется, введите имя или названия служб, которые Вы предпочитаете запускать перед этим сервисом с одной записи для каждой строки и затем нажимать "OK".

42
ответ дан 28 November 2019 в 19:18
  • 1
    Святая Корова! Это было самым быстрым ответом I' ve когда-либо получен. Я едва возвратился к домашней странице. –  Rick 12 June 2009 в 17:55

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

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

1
ответ дан 28 November 2019 в 19:18

Я искал чисто 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[]
);
2
ответ дан 28 November 2019 в 19:18

В 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
ответ дан 28 November 2019 в 19:18

Теги

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