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


Tengo un servicio de Windows que hace uso de 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 garantizar 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?


117
2018-06-12 14:52


origen




Respuestas:


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

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

Nota: Hay un espacio después el signo igual, y hay no uno antes de eso

Advertencia: depend= parámetro exagerar Lista de dependencias existentes, no anexar. Entonces, por ejemplo, si ServiceA ya depende de ServiceB y ServiceC, si ejecuta depend= ServiceD, ServiceA ahora dependerá solamente en ServiceD. (Gracias Mate!)

Ejemplos

Dependencia de otro servicio:

sc config ServiceA depend= ServiceB

Arriba significa que ServiceA no se iniciará hasta que ServiceB haya comenzado. Si detiene ServiceB, ServiceA se detendrá automáticamente.

Dependencia de múltiples otros servicios:

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

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

Para eliminar todas las dependencias:

sc config ServiceA depend= /

Para enumerar dependencias actuales:

sc qc ServiceA

180
2018-01-28 21:59



Originalmente había seleccionado la respuesta que indicaba cómo editar el registro. Pero usar el comando SC está más en línea con lo que estaba buscando. Gracias. - Rick
Si desea ver las dependencias existentes antes de cambiarlas con el método de Kip, puede escribir sc qc YourServiceName - mivk
Solo tenga cuidado ... Solo usé esto y no me di cuenta de que sobrescribiría 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 primero cualquier otra dependencia. - Matt
Si, como yo, su Servicio tiene espacios en el nombre, escríbalo entre comillas. - Lazlow
Si usa PowerShell, asegúrese de usar sc.exe de lo contrario, obtendrá un error: 'No se puede encontrar un parámetro posicional que acepte el argumento' - spuder


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

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


41
2018-06-12 14:53



Vaca santa Esa fue la respuesta más rápida que he recibido. Apenas regresé a la página de inicio. - Rick
+1 gracias, trabajé para mí. - Rich


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

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


1
2018-01-31 16:38



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


Estaba buscando un método puramente PowerShell (no regedit o sc.exe) que pueda funcionar en 2008R2 / Win7 y más reciente, 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)

los Cambio El método 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[]
);

1
2018-02-13 03:40



Probado funciona bien. Gracias por compartir. - CJBS


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

0
2017-08-02 06:58