Como adicionar dependência em um serviço do Windows após o serviço está instalado

129

Eu tenho um serviço do Windows que faz uso de um banco de dados do SQL Server. Eu não tenho controle sobre a instalação do serviço, mas gostaria de adicionar uma dependência no serviço para garantir que ele seja iniciado após o início do servidor SQL. (O SQL Server está sendo executado na mesma máquina que o serviço em questão)

Existe uma ferramenta para adicionar uma dependência ou possivelmente editar o registro diretamente?

    
por Rick 12.06.2009 / 16:52

5 respostas

194

Isso também pode ser feito por meio de um prompt de comando elevado usando o comando sc . A sintaxe é:

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

Nota : Existe um espaço após o sinal de igual, e não é anterior a ele.

Aviso : o parâmetro depend= substituirá a lista de dependências existente, não anexará. Portanto, por exemplo, se o ServiceA já depender do ServiceB e do ServiceC, se você executar depend= ServiceD , o ServiceA agora dependerá somente do ServiceD. (Obrigado Matt !)

Exemplos

Dependência de outro serviço:

sc config ServiceA depend= ServiceB

Acima significa que o ServiceA não será iniciado até que o ServiceB seja iniciado. Se você parar o ServiceB, o ServiceA irá parar automaticamente.

Dependência de vários outros serviços:

sc config ServiceA depend= ServiceB/ServiceC/ServiceD/"Service Name With Spaces"

Acima significa que o ServiceA não será iniciado até que ServiceB, ServiceC e ServiceD tenham sido iniciados. Se você interromper qualquer um dos ServiceB, ServiceC ou ServiceD, o ServiceA será interrompido automaticamente.

Para remover todas as dependências:

sc config ServiceA depend= /

Para listar as dependências atuais:

sc qc ServiceA
    
por 28.01.2011 / 22:59
42

Você pode adicionar dependências de serviço adicionando o valor "DependOnService" ao serviço no registro usando o comando regedit , os serviços podem ser encontrados em HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name> . Os detalhes podem ser encontrados no artigo do MS KB 193888 , do qual o seguinte é um trecho de:

To create a new dependency, select the subkey representing the service you want to delay, click Edit, and then click Add Value. Create a new value name "DependOnService" (without the quotation marks) with a data type of REG_MULTI_SZ, and then click OK. When the Data dialog box appears, type the name or names of the services that you prefer to start before this service with one entry for each line, and then click OK.

    
por 12.06.2009 / 16:53
2

Eu estava procurando por um método puramente PowerShell (sem regedit ou sc.exe) que pudesse funcionar no 2008R2 / Win7 e mais recente, e surgiu com isso:

É fácil fazer o regedit com o PowerShell:

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

Ou usando o 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)

O método Alterar da classe Win32_Service ajudou a apontar para uma solução:

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[]
);
    
por 13.02.2017 / 04:40
1

Eu escrevi um aplicativo .net simples para gerenciar dependências de serviço, se você estiver interessado. É grátis.

link

    
por 31.01.2013 / 17:38
0

Em C ++ (ATL) eu gostei disso

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
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%pre%OtherService%pre%";
      R.SetValue(key.c_str(), REG_MULTI_SZ, deps, sizeof(deps));
    }

    R.Close();
    return true;
  }
  return false;
}
OtherService%pre%"; R.SetValue(key.c_str(), REG_MULTI_SZ, deps, sizeof(deps)); } R.Close(); return true; } return false; }
    
por 02.08.2018 / 08:58