it-swarm-fr.com

Comment ajouter une dépendance à un service Windows APRÈS l'installation du service

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 je voudrais ajouter une dépendance sur le service pour m'assurer qu'il démarre après le démarrage de SQL Server. (SQL Server s'exécute sur la même machine que le service en question)

Existe-t-il un outil pour ajouter une dépendance ou éventuellement modifier directement le registre?

135
Rick

Cela peut également être fait via une invite de commande élevée en utilisant la commande sc. La syntaxe est:

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 not ​​un avant .

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

Exemples

Dépendance à l'égard d'un autre service:

sc config ServiceA depend= ServiceB

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

Dépendance à l'égard de 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'auront pas tous démarré. Si vous arrêtez l'un des ServiceB, ServiceC ou ServiceD, ServiceA s'arrêtera automatiquement.

Pour supprimer toutes les dépendances:

sc config ServiceA depend= /

Pour répertorier les dépendances actuelles:

sc qc ServiceA
203
Kip

Vous pouvez ajouter des dépendances de service en ajoutant la valeur "DependOnService" au service dans le registre à l'aide de la commande regedit, les services peuvent être trouvés sous HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>. Les détails peuvent être trouvés sur MS KB article 193888 , 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 s'affiche, 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.

42
pauska

Je cherchais une méthode purement PowerShell (pas de regedit ou sc.exe) qui puisse fonctionner sur 2008R2/Win7 et plus récent, et j'ai trouvé ceci:

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 d'identifier 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[]
);
2
JoeGasper

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
Glenn Sullivan

En C++ (ATL) j'ai aimé ç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
AndersK