Como adicionar dependência em um serviço do Windows APÓS o serviço ser instalado

133

Eu tenho um serviço do Windows que faz uso de um banco de dados do SQL Server. Não tenho controle sobre a instalação do serviço, mas gostaria de adicionar uma dependência ao serviço para garantir que ele inicie após o início do SQL Server. (O servidor SQL 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?

Rick
fonte

Respostas:

199

Isso também pode ser feito através de um prompt de comando elevado usando o sccomando A sintaxe é:

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

Nota : Há um espaço após o sinal de igual, e há não que antes dela.

Aviso : o depend=parâmetro substituirá a lista de dependências existente, não será anexada. Por exemplo, se o ServiceA já depende do ServiceB e ServiceC, se você executar depend= ServiceD, o ServiceA agora dependerá apenas 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é o ServiceB ser iniciado. Se você parar o ServiceB, o ServiceA será interrompido 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ê parar qualquer um dos ServiceB, ServiceC ou ServiceD, o ServiceA será interrompido automaticamente.

Para remover todas as dependências:

sc config ServiceA depend= /

Para listar dependências atuais:

sc qc ServiceA
Kip
fonte
5
Se você quiser ver as dependências existentes antes de alterá-las com o método Kip, digite sc qc
YourServiceName
1
Apenas tome cuidado ... Acabei de usar isso e não percebi que ele substituirá as dependências existentes .. havia duas para o meu serviço que não me lembro .. agora elas se foram .. oh bem! Portanto, certifique-se de executar o comando @mivk mencionado primeiro para ver outras dependências primeiro.
Matt
1
Você pode consultar actualmente configurado dependência para um serviço usando sc qc [service name]o comando
gerrytan
4
Se, como eu, seu Serviço tiver espaços no nome, coloque-o entre aspas.
Lazlow
6
Se estiver usando o PowerShell, certifique-se de usar o sc.execontrário. Você receberá um erro: 'Não foi possível encontrar um parâmetro posicional que aceite argumento'
spuder 17/04/2015
42

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

Para criar uma nova dependência, selecione a subchave que representa o serviço que você deseja atrasar, clique em Editar e, em seguida, clique em Adicionar valor. Crie um novo nome de valor "DependOnService" (sem as aspas) com um tipo de dados REG_MULTI_SZ e, em seguida, clique em OK. Quando a caixa de diálogo Dados aparecer, digite o nome ou os nomes dos serviços que você prefere iniciar antes deste serviço com uma entrada para cada linha e clique em OK.

pauska
fonte
7
Vaca sagrada! Essa foi a resposta mais rápida que eu já recebi. Mal voltei à página inicial.
Rick
2

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

O mais 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 Change 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[]
);
JoeGasper
fonte
1

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

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

Glenn Sullivan
fonte
1
Ele está me dizendo que eu preciso NET 1.1, mas estou executando o Windows 7
Nick
1
NET 1.1 precisa ser instalado no Windows 7. Veja a resposta a esta pergunta: answers.microsoft.com/en-us/windows/forum/...
Glenn Sullivan
9
Realmente, em 2014 você recomendava instalar o .NET 1.1 no Win7 em vez de apenas recompilar para o 4.0? Obrigado, não.
Endrju
0

Em C ++ (ATL) eu fiz assim

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;
}
Anders
fonte