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


J'ai un service Windows qui utilise une base de données SQL Server. Je n'ai aucun 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?


117
2018-06-12 14:52


origine




Réponses:


Cela peut également être fait via une invite de commande élevée utilisant le sc commander. 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 y a ne pas un avant elle.

Attention: depend= paramètre sera écraser liste des dépendances existantes, pas ajouter. Ainsi, par exemple, si ServiceA dépend déjà de ServiceB et ServiceC, si vous exécutez depend= ServiceD, ServiceA dépendra maintenant seulement sur ServiceD. (Merci Mat!)

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

180
2018-01-28 21:59



J'avais à l'origine choisi la réponse indiquant comment éditer le registre. Mais utiliser la commande SC correspond plus à ce que je cherchais. THX. - Rick
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
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 plus ... 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
Si, comme moi, votre service comporte des espaces dans le nom, mettez-le entre guillemets. - Lazlow
Si vous utilisez Powershell, assurez-vous d'utiliser sc.exe sinon, vous obtiendrez une erreur: "Impossible de trouver un paramètre de position acceptant les arguments" - spuder


Vous pouvez ajouter des dépendances de service en ajoutant la valeur "DependOnService" au service dans le registre à l'aide du bouton regedit commande, les services se trouvent sous HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>. Les détails peuvent être trouvés à Article MS KB 193888, dont voici un extrait:

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


41
2018-06-12 14:53



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
+1 Merci, a travaillé pour moi. - Rich


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


1
2018-01-31 16:38



Il me dit que j'ai besoin de .NET 1.1 mais je suis sous Windows 7 - Nick
.Net 1.1 doit être installé sur Windows 7. Voir la réponse à cette question: answers.microsoft.com/en-us/windows/forum/… - Glenn Sullivan
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


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é fait:

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)

le Changement La méthode 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[]
);

1
2018-02-13 03:40



Testé; fonctionne bien. Merci d'avoir partagé. - CJBS


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

0
2017-08-02 06:58