sviluppo-web-qa.it

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

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?

135
Rick

Questo può essere fatto anche tramite un prompt dei comandi elevato usando il comando sc. La sintassi è:

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

Nota : C'è uno spazio dopo il segno di uguale e c'è no = uno prima di esso.

Avviso : il parametro depend= Sovrascriverà sovrascrive l'elenco delle dipendenze esistenti , non aggiungere. Ad esempio, se ServiceA dipende già da ServiceB e ServiceC, se si esegue depend= ServiceD, ServiceA ora dipenderà solo da ServiceD. (Grazie Opaco !)

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
203
Kip

È possibile aggiungere dipendenze del servizio aggiungendo il valore "DependOnService" al servizio nel registro utilizzando il comando regedit, i servizi sono disponibili in HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>. I dettagli sono disponibili in articolo di MS KB 193888 , da cui un estratto è tratto da:

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.

42
pauska

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 Modifica 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[]
);
2
JoeGasper

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

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

1
Glenn Sullivan

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