Comment ajouter une dépendance à un service Windows APRÈS que le service soit installé

134

J'ai un service Windows qui utilise une base de données SQL Server. Je n'ai pas le contrôle sur l'installation du service, mais j'aimerais ajouter une dépendance sur le service pour qu'il démarre après le démarrage du serveur SQL. (Le serveur SQL s'exécute sur le même ordinateur que le service en question)

Existe-t-il un outil permettant d’ajouter une dépendance ou d’éditer directement le registre?

Meule
la source

Réponses:

200

Cela peut également être fait via une invite de commande élevée à l'aide de la sccommande. La syntaxe est la suivante:

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

Remarque : il y a un espace après le signe égal et il n'y en a pas avant.

Attention : le depend=paramètre écrasera la liste des dépendances existantes et ne l'ajoutera pas. Ainsi, par exemple, si ServiceA dépend déjà de ServiceB et ServiceC, si vous exécutez depend= ServiceD, ServiceA ne dépendra plus que de ServiceD. (Merci Matt !)

Exemples

Dépendance à un autre service:

sc config ServiceA depend= ServiceB

Ci-dessus signifie que ServiceA ne démarrera pas tant que ServiceB n'aura pas démarré. Si vous arrêtez ServiceB, ServiceA s’arrêtera automatiquement.

Dépendance sur plusieurs autres services:

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

Ci-dessus signifie que ServiceA ne démarrera pas tant que ServiceB, ServiceC et ServiceD n'ont pas démarré. Si vous arrêtez ServiceB, ServiceC ou ServiceD, ServiceA s'arrête automatiquement.

Pour supprimer toutes les dépendances:

sc config ServiceA depend= /

Pour lister les dépendances actuelles:

sc qc ServiceA
Kip
la source
5
Si vous voulez voir les dépendances existantes avant de les changer avec la méthode de Kip, vous pouvez taper sc qc YourServiceName
mivk
1
Fais juste attention ... je viens juste d'utiliser ça et je ne savais pas que cela écraserait les dépendances existantes ... il y en avait deux pour mon service dont je ne me souviens pas ... maintenant, elles sont parties .. oh bien! Veillez donc à exécuter la commande @mivk mentionnée en premier pour voir d’abord les autres dépendances.
Matt
1
Vous pouvez interroger les dépendances actuellement configurées pour un service à l'aide de la sc qc [service name]commande
gerrytan
4
Si, comme moi, votre service comporte des espaces dans le nom, mettez-le entre guillemets.
Lazlow
6
Si vous utilisez powershell, assurez-vous de bien utiliser sc.exesinon vous obtiendrez une erreur: "Un paramètre de position qui accepte les arguments ne peut pas être trouvé"
spuder
42

Vous pouvez ajouter des dépendances de service en ajoutant la valeur "DependOnService" au service dans le registre à l'aide de la regeditcommande, les services se trouvent sous HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>. Les détails se trouvent dans l' article 193888 de la base de connaissances , dont voici un extrait:

Pour créer une nouvelle dépendance, sélectionnez la sous-clé représentant le service que vous souhaitez retarder, cliquez sur Modifier, puis sur Ajouter une valeur. Créez un nouveau nom de valeur "DependOnService" (sans les guillemets) avec un type de données REG_MULTI_SZ, puis cliquez sur OK. Lorsque la boîte de dialogue Données apparaît, tapez le nom ou les noms des services que vous préférez démarrer avant ce service avec une entrée pour chaque ligne, puis cliquez sur OK.

Pauska
la source
7
Vache sacrée! C'était la réponse la plus rapide que j'ai jamais reçue. Je reviens à peine à la page d'accueil.
Rick le
2

Je recherchais une méthode purement PowerShell (pas de regedit ni de sc.exe) pouvant fonctionner sur les versions 2008R2 / Win7 et supérieures, et voici ce qui a été donné:

Le plus simple est de faire le regedit avec PowerShell:

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

Ou, en utilisant 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)

La méthode Change de la classe Win32_Service a permis de pointer vers une solution:

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
la source
1

J'ai écrit une simple application .net pour gérer les dépendances de service, si cela vous intéresse. C'est gratuit.

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

Glenn Sullivan
la source
1
Il me dit que j'ai besoin de .NET 1.1 mais je suis sous Windows 7
Nick
1
.Net 1.1 doit être installé sur Windows 7. Voir la réponse à cette question: answers.microsoft.com/en-us/windows/forum/…
Glenn Sullivan
9
Vraiment, en 2014, vous recommandiez d'installer .NET 1.1 sur Win7 au lieu de simplement le recompiler pour la version 4.0? Merci, non
Endrju
0

En C ++ (ATL) j'ai fait comme ça

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
la source