Come aggiungere dipendenza da un servizio Windows DOPO che il servizio è installato


134

Ho un servizio Windows che utilizza un database SQL Server. Non ho il controllo sull'installazione del servizio, ma vorrei aggiungere una dipendenza dal servizio per assicurarmi che si avvii dopo l'avvio del server SQL. (Il server SQL è in esecuzione sullo stesso computer del servizio in questione)

Esiste uno strumento per aggiungere una dipendenza o eventualmente modificare direttamente il registro?

Risposte:


200

Questo può essere fatto anche tramite un prompt dei comandi elevato utilizzando il sccomando. La sintassi è:

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

Nota : C'è uno spazio dopo il segno di uguale, e non v'è , non quella precedente.

Avvertenza : il depend=parametro sovrascriverà l' elenco delle dipendenze esistenti, non accoderà. Ad esempio, se ServiceA dipende già da ServiceB e ServiceC, se si esegue depend= ServiceD, ServiceA ora dipenderà solo da ServiceD. (Grazie Matt !)

Esempi

Dipendenza da un altro servizio:

sc config ServiceA depend= ServiceB

Sopra indica che ServiceA non si avvia fino all'avvio di ServiceB. Se interrompi ServiceB, ServiceA si arresterà automaticamente.

Dipendenza da più altri servizi:

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

Sopra indica che ServiceA non si avvierà fino a quando ServiceB, ServiceC e ServiceD non saranno stati avviati. Se si interrompe uno qualsiasi di ServiceB, ServiceC o ServiceD, ServiceA si arresterà automaticamente.

Per rimuovere tutte le dipendenze:

sc config ServiceA depend= /

Per elencare le dipendenze correnti:

sc qc ServiceA

5
Se vuoi vedere le dipendenze esistenti prima di modificarle con il metodo di Kip, puoi digitare sc qc YourServiceName
mivk

1
Stai solo attento ... L'ho appena usato e non mi sono reso conto che sovrascriverà le dipendenze esistenti .. ce n'erano due per il mio servizio che non ricordo ... ora se ne sono andati .. vabbè! Quindi assicurati di eseguire prima il comando @mivk per vedere prima eventuali altre dipendenze.
Matt,

1
È possibile eseguire una query sulla dipendenza attualmente configurata per un servizio utilizzando il sc qc [service name]comando
gerrytan,

4
Se come me, il tuo servizio ha spazi nel nome, racchiudilo tra virgolette.
Lazlow,

6
Se usi PowerShell, assicurati di usarlo sc.exealtrimenti otterrai un errore: "Impossibile trovare un parametro posizionale che accetta l'argomento"
spuder

42

È possibile aggiungere dipendenze del servizio aggiungendo il valore "DependOnService" al servizio nel registro utilizzando il regeditcomando, i servizi sono disponibili in HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>. I dettagli sono disponibili nell'articolo 193888 di MS KB , dal quale è riportato un estratto di:

Per creare una nuova dipendenza, selezionare la sottochiave che rappresenta il servizio che si desidera ritardare, fare clic su Modifica, quindi su Aggiungi valore. Creare un nuovo nome valore "DependOnService" (senza virgolette) con un tipo di dati di REG_MULTI_SZ, quindi fare clic su OK. Quando viene visualizzata la finestra di dialogo Dati, digitare il nome o i nomi dei servizi che si preferisce avviare prima di questo servizio con una voce per ogni riga, quindi fare clic su OK.


7
Mucca sacra! Questa è stata la risposta più veloce che abbia mai ricevuto. Sono appena tornato alla home page.
Rick,

2

Stavo cercando un metodo puramente PowerShell (no regedit o sc.exe) in grado di funzionare su 2008R2 / Win7 e versioni successive, e ho trovato questo:

Semplice è fare il regedit con PowerShell:

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

Oppure, 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)

Il metodo Change della classe Win32_Service ha aiutato a indicare una soluzione:

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

Ho scritto una semplice applicazione .net per gestire le dipendenze del servizio, se sei interessato. È gratis.

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


1
Mi sta dicendo che ho bisogno di .NET 1.1 ma sto eseguendo Windows 7
Nick,

1
.Net 1.1 deve essere installato su Windows 7. Leggi la risposta a questa domanda: answer.microsoft.com/en-us/windows/forum/…
Glenn Sullivan,

9
Davvero, nel 2014 raccomandavi di installare .NET 1.1 su Win7 invece di ricompilarlo per 4.0? Grazie no
Endrju,

0

In C ++ (ATL) mi è piaciuto questo

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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.