Frage So fügen Sie eine Abhängigkeit zu einem Windows-Dienst hinzu, nachdem der Dienst installiert wurde


Ich habe einen Windows-Dienst, der eine SQL Server-Datenbank verwendet. Ich habe keine Kontrolle über die Installation des Dienstes, möchte jedoch eine Abhängigkeit vom Dienst hinzufügen, um sicherzustellen, dass er nach dem Start des SQL-Servers gestartet wird. (Der SQL-Server läuft auf demselben Computer wie der betreffende Dienst)

Gibt es ein Tool, um eine Abhängigkeit hinzuzufügen oder die Registrierung direkt zu bearbeiten?


117
2018-06-12 14:52


Ursprung




Antworten:


Dies kann auch über eine erhöhte Eingabeaufforderung mit Hilfe der sc Befehl. Die Syntax lautet:

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

Hinweis: Da ist ein Platz nach dem das Gleichheitszeichen, und es gibt nicht einer davor.

Warnung: depend= Parameter wird überschreiben vorhandene Abhängigkeiten Liste, nicht anhängen. Also zum Beispiel, wenn ServiceA bereits von ServiceB und ServiceC abhängt, wenn Sie laufen depend= ServiceD, ServiceA wird jetzt abhängen nur auf ServiceD. (Vielen Dank Matt!)

Beispiele

Abhängigkeit von einem anderen Dienst:

sc config ServiceA depend= ServiceB

Oben bedeutet, dass ServiceA nicht gestartet wird, bis ServiceB gestartet wurde. Wenn Sie ServiceB beenden, wird ServiceA automatisch beendet.

Abhängigkeit von mehreren anderen Diensten:

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

Oben bedeutet, dass ServiceA nicht gestartet wird, bis ServiceB, ServiceC und ServiceD gestartet wurden. Wenn Sie ServiceB, ServiceC oder ServiceD beenden, wird ServiceA automatisch beendet.

Um alle Abhängigkeiten zu entfernen:

sc config ServiceA depend= /

Um aktuelle Abhängigkeiten aufzulisten:

sc qc ServiceA

180
2018-01-28 21:59



Ich hatte ursprünglich die Antwort ausgewählt, die angibt, wie die Registrierung bearbeitet wird. Aber mit dem SC-Befehl ist mehr in Einklang mit dem, was ich suchte. Vielen Dank. - Rick
Wenn Sie die vorhandenen Abhängigkeiten anzeigen möchten, bevor Sie sie mit der Methode von Kip ändern, können Sie sc qc YourServiceName eingeben - mivk
Sei nur vorsichtig ... Ich habe das nur benutzt und nicht bemerkt, dass es bestehende Abhängigkeiten überschreiben wird. Es gab zwei für meinen Dienst, an die ich mich nicht erinnern kann .. jetzt sind sie weg ... na ja! Stellen Sie also sicher, dass Sie zuerst den Befehl @mivk ausführen, um zuerst andere Abhängigkeiten zu sehen. - Matt
Wenn Ihr Service wie ich Leerzeichen im Namen hat, fügen Sie ihn in Anführungszeichen ein. - Lazlow
Wenn Sie Powershell verwenden, stellen Sie sicher, dass Sie es verwenden sc.exe Andernfalls erhalten Sie einen Fehler: 'Ein Positionsparameter, der Argumente akzeptiert, kann nicht gefunden werden' - spuder


Sie können Dienstabhängigkeiten hinzufügen, indem Sie den Wert "DependOnService" zum Dienst in der Registrierung hinzufügen regedit Befehl, Dienste finden Sie unter HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>. Die Details finden Sie unter MS KB Artikel 193888, woraus folgt ein Auszug aus:

Um eine neue Abhängigkeit zu erstellen, wählen Sie die Option   Unterschlüssel, der den Service darstellt   möchte verzögern, klicken Sie auf Bearbeiten und dann   Klicken Sie auf Wert hinzufügen. Erstellen Sie einen neuen Wert   Name "DependOnService" (ohne die   Anführungszeichen) mit einem Datentyp von   REG_MULTI_SZ, und klicken Sie dann auf OK. Wann   Das Dialogfeld Daten wird angezeigt. Geben Sie den Wert ein   Name oder Namen der Dienste, die Sie   bevorzugen, vor diesem Service zu beginnen   mit einem Eintrag für jede Zeile und dann   OK klicken.


41
2018-06-12 14:53



Heilige Kuh! Das war die schnellste Antwort, die ich je erhalten habe. Ich bin kaum zur Startseite zurückgekehrt. - Rick
+1 Danke, hat für mich gearbeitet. - Rich


Ich habe eine einfache .net-Anwendung geschrieben, um Service-Abhängigkeiten zu verwalten, wenn Sie interessiert sind. Es ist kostenlos.

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


1
2018-01-31 16:38



Es sagt mir, ich brauche .NET 1.1, aber ich benutze Windows 7 - Nick
.Net 1.1 muss unter Windows 7 installiert werden. Siehe die Antwort auf diese Frage: Antworten.microsoft.com/en-us/windows/forum/... - Glenn Sullivan
Wirklich, im Jahr 2014 haben Sie empfohlen, .NET 1.1 auf Win7 zu installieren, anstatt es nur für 4.0 neu zu kompilieren? Danke, nein. - Endrju


Ich war auf der Suche nach einer reinen PowerShell (keine regedit oder sc.exe) -Methode, die auf 2008R2 / Win7 und neuer arbeiten kann, und kam damit auf:

Einfach ist das Regedit mit PowerShell:

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

Oder mit 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)

Das Veränderung Methode der Win32_Service-Klasse half, auf eine Lösung hinzuweisen:

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



Geprüft; funktioniert gut. Danke für das Teilen. - CJBS


In C ++ (ATL) hat mir das gefallen

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