Jak dodać zależność od usługi Windows PO zainstalowaniu usługi

133

Mam usługę systemu Windows, która korzysta z bazy danych SQL Server. Nie mam kontroli nad instalacją usługi, ale chciałbym dodać zależność od usługi, aby upewnić się, że uruchomi się ona po uruchomieniu serwera SQL. (Serwer SQL działa na tym samym komputerze co dana usługa)

Czy istnieje narzędzie do dodawania zależności lub bezpośredniej edycji rejestru?

Stóg
źródło

Odpowiedzi:

199

Można to również zrobić za pomocą wiersza polecenia z podwyższonym poziomem uprawnień za pomocą scpolecenia. Składnia jest następująca:

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

Uwaga : po znaku równości jest spacja , a przed nią nie ma spacji .

Ostrzeżenie : depend=parametr zastąpi istniejącą listę zależności, a nie dołączy. Na przykład, jeśli ServiceA już zależy od ServiceB i ServiceC, jeśli uruchomisz depend= ServiceD, ServiceA będzie teraz zależeć tylko od ServiceD. (Dzięki Matt !)

Przykłady

Zależność od jednej innej usługi:

sc config ServiceA depend= ServiceB

Powyżej oznacza, że ​​ServiceA nie uruchomi się, dopóki nie uruchomi się ServiceB. Jeśli zatrzymasz ServiceB, ServiceA zatrzyma się automatycznie.

Zależność od wielu innych usług:

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

Powyżej oznacza, że ​​ServiceA nie uruchomi się, dopóki nie uruchomią się ServiceB, ServiceC i ServiceD. W przypadku zatrzymania któregokolwiek z ServiceB, ServiceC lub ServiceD, ServiceA zatrzyma się automatycznie.

Aby usunąć wszystkie zależności:

sc config ServiceA depend= /

Aby wyświetlić bieżące zależności:

sc qc ServiceA
Wyrko
źródło
5
Jeśli chcesz zobaczyć istniejące zależności przed ich zmianą metodą Kipa, możesz wpisać sc qc YourServiceName
mivk
1
Bądź ostrożny ... Właśnie tego użyłem i nie zdawałem sobie sprawy, że zastąpi to istniejące zależności .. były dwie moje usługi, których nie pamiętam .. teraz ich nie ma ... no cóż! Upewnij się więc, że najpierw uruchomiłeś komendę @mivk, aby najpierw zobaczyć inne zależności.
Matt
1
Możesz zapytać aktualnie skonfigurowaną zależność dla usługi za pomocą sc qc [service name]polecenia
gerrytan
4
Jeśli tak jak ja, Twoja usługa ma spacje w nazwie, umieść je w cudzysłowie.
Lazlow
6
Jeśli używasz programu PowerShell, upewnij się, że używasz, w sc.exeprzeciwnym razie pojawi się błąd: „Nie można znaleźć parametru pozycyjnego, który akceptuje argument”
spuder
42

Możesz dodać zależności usługi, dodając wartość „DependOnService” do usługi w rejestrze za pomocą regeditpolecenia, usługi można znaleźć pod HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>. Szczegóły można znaleźć w artykule MS KB 193888 , z którego poniżej znajduje się fragment:

Aby utworzyć nową zależność, wybierz podklucz reprezentujący usługę, którą chcesz opóźnić, kliknij Edytuj, a następnie kliknij Dodaj wartość. Utwórz nową nazwę wartości „DependOnService” (bez znaków cudzysłowu) z typem danych REG_MULTI_SZ, a następnie kliknij przycisk OK. Kiedy pojawi się okno dialogowe Dane, wpisz nazwę lub nazwy usług, które wolisz uruchomić przed tą usługą, z jednym wpisem dla każdej linii, a następnie kliknij OK.

Pauska
źródło
7
Święta krowa! To była najszybsza odpowiedź, jaką kiedykolwiek otrzymałem. Ledwo wróciłem do strony głównej.
Rick
2

Szukałem metody czysto PowerShell (bez regedit lub sc.exe), która może działać na 2008R2 / Win7 i nowszych, i wymyśliłem:

Łatwo jest zrobić regedit z PowerShell:

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

Lub za pomocą 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)

Zmień metoda klasy Win32_Service pomógł punkt do rozwiązania:

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[]
);
JoeGasper
źródło
1

Napisałem prostą aplikację .net do zarządzania zależnościami serwisowymi, jeśli jesteś zainteresowany. Jest wolne.

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

Glenn Sullivan
źródło
1
Mówi mi, że potrzebuję .NET 1.1, ale korzystam z systemu Windows 7
Nick
1
.Net 1.1 musi być zainstalowany w systemie Windows 7. Zobacz odpowiedź na to pytanie: answer.microsoft.com/en-us/windows/forum/...
Glenn Sullivan
9
Naprawdę, w 2014 roku zalecałeś zainstalowanie .NET 1.1 na Win7 zamiast po prostu rekompilować go dla 4.0? Dzięki, nie
Endrju
0

W C ++ (ATL) podobało mi się to

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;
}
Anders
źródło