Vraag Hoe afhankelijkheid van een Windows-service toe te voegen NADAT de service is geïnstalleerd


Ik heb een Windows-service die gebruikmaakt van een SQL Server-database. Ik heb geen controle over de installatie van de service, maar wil graag een afhankelijkheid van de service toevoegen om te zorgen dat deze start nadat de SQL-server is gestart. (SQL-server draait op dezelfde machine als de betreffende service)

Is er een hulpmiddel om een ​​afhankelijkheid toe te voegen of het register eventueel rechtstreeks te bewerken?


117
2018-06-12 14:52


oorsprong




antwoorden:


Dit kan ook worden gedaan via een verhoogde opdrachtprompt met behulp van de sc commando. De syntaxis is:

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

Notitie: Er is een spatie na het gelijkteken, en dat is er niet één ervoor.

Waarschuwing: depend= parameter zal beschrijven bestaande lijst met afhankelijkheden, niet toevoegen. Dus bijvoorbeeld, als ServiceA al afhankelijk is van ServiceB en ServiceC, als u werkt depend= ServiceD, ServiceA is nu afhankelijk enkel en alleen op ServiceD. (Bedankt Mat!)

Voorbeelden

Afhankelijkheid van een andere service:

sc config ServiceA depend= ServiceB

Boven betekent dat ServiceA niet zal starten voordat ServiceB is gestart. Als u ServiceB stopt, stopt ServiceA automatisch.

Afhankelijkheid van meerdere andere services:

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

Boven betekent dat ServiceA niet zal starten voordat ServiceB, ServiceC en ServiceD allemaal zijn gestart. Als u een van ServiceB, ServiceC of ServiceD stopt, stopt ServiceA automatisch.

Om alle afhankelijkheden te verwijderen:

sc config ServiceA depend= /

Om de huidige afhankelijkheden op te sommen:

sc qc ServiceA

180
2018-01-28 21:59



Ik had oorspronkelijk het antwoord geselecteerd dat aangeeft hoe het register moet worden bewerkt. Maar het gebruik van de SC-opdracht komt meer overeen met wat ik zocht. Dankje. - Rick
Als u de bestaande afhankelijkheden wilt zien voordat u ze wijzigt met de methode van Kip, typt u sc qc YourServiceName - mivk
Wees voorzichtig ... ik heb dit net gebruikt en realiseerde me niet dat het bestaande afhankelijkheden zal overschrijven. Er waren er twee voor mijn service die ik niet meer weet. Nu zijn ze weg. Ach ja! Dus zorg ervoor dat je het commando @mivk als eerste gebruikt om eerst andere afhankelijkheden te zien. - Matt
Als u, zoals ik, uw Service spaties in de naam heeft, voeg deze tussen aanhalingstekens. - Lazlow
Als je powershell gebruikt, zorg dan dat je het gebruikt sc.exe anders krijg je een foutmelding: 'Er is geen positionele parameter gevonden die argument accepteert' - spuder


U kunt serviceafhankelijkheden toevoegen door de waarde "DependOnService" toe te voegen aan de service in het register met behulp van de regedit commando, services zijn te vinden onder HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>. De details zijn te vinden op MS KB-artikel 193888, waarvan het volgende een uittreksel is van:

Als u een nieuwe afhankelijkheid wilt maken, selecteert u de   subsleutel die de service die u vertegenwoordigt   wilt vertragen, klikt u op Bewerken en vervolgens op   klik op Waarde toevoegen. Maak een nieuwe waarde   naam "DependOnService" (zonder de   aanhalingstekens) met een gegevenstype van   REG_MULTI_SZ en klik vervolgens op OK. Wanneer   het dialoogvenster Gegevens verschijnt, typ de   naam of namen van de diensten die u   start liever voor deze service   met één regel voor elke regel en dan   Klik OK.


41
2018-06-12 14:53



Heilige koe! Dat was het snelste antwoord dat ik ooit heb gekregen. Ik kwam amper terug op de startpagina. - Rick
+1 Bedankt, werkte voor mij. - Rich


Ik heb een eenvoudige .net-applicatie geschreven om de service-afhankelijkheden te beheren, als je geïnteresseerd bent. Het is gratis.

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


1
2018-01-31 16:38



Het vertelt me ​​dat ik .NET 1.1 nodig heb, maar ik start Windows 7 - Nick
.Net 1.1 moet worden geïnstalleerd op Windows 7. Zie het antwoord op deze vraag: answers.microsoft.com/en-us/windows/forum/... - Glenn Sullivan
Echt, in 2014 raadde je aan om .NET 1.1 op Win7 te installeren in plaats van het alleen opnieuw te compileren voor 4.0? Bedankt, nee. - Endrju


Ik was op zoek naar een pure PowerShell (geen regedit of sc.exe) methode die kan werken op 2008R2 / Win7 en nieuwer, en kwam met dit:

Gemakkelijke men doet de regedit met PowerShell:

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

Of, met behulp van 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)

De Verandering methode van de klasse Win32_Service heeft geholpen naar een oplossing te wijzen:

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



getest; werkt goed. Bedankt voor het delen. - CJBS


In C ++ (ATL) vond ik dit leuk

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