Cómo agregar dependencia en un servicio de Windows DESPUÉS de que el servicio esté instalado

134

Tengo un servicio de Windows que utiliza una base de datos de SQL Server. No tengo control sobre la instalación del servicio, pero me gustaría agregar una dependencia en el servicio para asegurar que se inicie después de que se haya iniciado el servidor SQL. (El servidor SQL se ejecuta en la misma máquina que el servicio en cuestión)

¿Existe una herramienta para agregar una dependencia o posiblemente editar el registro directamente?

Almiar
fuente

Respuestas:

200

Esto también se puede hacer a través de un símbolo del sistema elevado utilizando el sccomando. La sintaxis es:

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

Nota : Hay un espacio después del signo igual, y hay no tiene ante sí.

Advertencia : el depend=parámetro sobrescribirá la lista de dependencias existentes, no se agregará. Entonces, por ejemplo, si ServiceA ya depende de ServiceB y ServiceC, si ejecuta depend= ServiceD, ServiceA ahora solo dependerá de ServiceD. (¡Gracias Matt !)

Ejemplos

Dependencia de otro servicio:

sc config ServiceA depend= ServiceB

Arriba significa que el Servicio A no se iniciará hasta que el Servicio B haya comenzado. Si detiene el Servicio B, el Servicio A se detendrá automáticamente.

Dependencia de múltiples otros servicios:

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

Lo anterior significa que ServiceA no se iniciará hasta que ServiceB, ServiceC y ServiceD hayan comenzado. Si detiene cualquiera de ServiceB, ServiceC o ServiceD, ServiceA se detendrá automáticamente.

Para eliminar todas las dependencias:

sc config ServiceA depend= /

Para enumerar las dependencias actuales:

sc qc ServiceA
Dormir
fuente
55
Si desea ver las dependencias existentes antes de cambiarlas con el método de Kip, puede escribir sc qc YourServiceName
mivk
1
Solo tenga cuidado ... acabo de usar esto y no me di cuenta de que sobrescribirá las dependencias existentes ... había dos para mi servicio que no recuerdo ... ahora se han ido ... ¡bueno! Así que asegúrese de ejecutar el comando @mivk mencionado primero para ver cualquier otra dependencia primero.
Matt
1
Puede consultar la dependencia configurada actualmente para un servicio utilizando el sc qc [service name]comando
gerrytan
44
Si, como yo, su Servicio tiene espacios en el nombre, escríbalo entre comillas.
Lazlow
66
Si usa powershell, asegúrese de usarlo, de lo sc.execontrario obtendrá un error: 'No se puede encontrar un parámetro posicional que acepte el argumento'
spuder
42

Puede agregar dependencias de servicio agregando el valor "DependOnService" al servicio en el registro utilizando el regeditcomando, los servicios se pueden encontrar en HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>. Los detalles se pueden encontrar en el artículo 193888 de MS KB , del cual lo siguiente es un extracto de:

Para crear una nueva dependencia, seleccione la subclave que representa el servicio que desea retrasar, haga clic en Editar y luego en Agregar valor. Cree un nuevo nombre de valor "DependOnService" (sin las comillas) con un tipo de datos de REG_MULTI_SZ, y luego haga clic en Aceptar. Cuando aparezca el cuadro de diálogo Datos, escriba el nombre o los nombres de los servicios que prefiere iniciar antes de este servicio con una entrada para cada línea y luego haga clic en Aceptar.

pauska
fuente
77
Holy Cow! Esa fue la respuesta más rápida que he recibido. Apenas volví a la página de inicio.
Rick
2

Estaba buscando un método puramente PowerShell (sin regedit o sc.exe) que pueda funcionar en 2008R2 / Win7 y versiones posteriores, y se me ocurrió esto:

Fácil es hacer el regedit con PowerShell:

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

O, usando 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)

El método Change de la clase Win32_Service ayudó a señalar una solución:

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
fuente
1

Escribí una aplicación .net simple para administrar las dependencias de servicio, si está interesado. Es gratis.

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

Glenn Sullivan
fuente
1
Me dice que necesito .NET 1.1 pero estoy ejecutando Windows 7
Nick
1
.Net 1.1 debe instalarse en Windows 7. Consulte la respuesta a esta pregunta: answers.microsoft.com/en-us/windows/forum/…
Glenn Sullivan
99
¿Realmente, en 2014 recomendabas instalar .NET 1.1 en Win7 en lugar de simplemente recompilarlo para 4.0? Gracias no.
Endrju
0

En C ++ (ATL) me gustó esto

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
fuente