Hizmet yüklendikten SONRA bir Windows Hizmetine bağımlılık nasıl eklenir


133

SQL Server veritabanını kullanan bir Windows Hizmetim var. Servisin kurulumu üzerinde kontrol sahibi değilim, ancak SQL server başladıktan sonra başladığından emin olmak için servise bağımlılık eklemek istiyorum. (SQL server, söz konusu servisle aynı makinede çalışıyor)

Bağımlılık eklemek veya kayıt defterini doğrudan düzenlemek için bir araç var mı?

Yanıtlar:


199

Bu, komutu kullanarak yükseltilmiş bir komut istemi aracılığıyla da yapılabilir sc. Sözdizimi:

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

Not : Bir yer yoktur sonrasında Eşittir işareti ve orada değil ondan önce biri.

Uyarı : depend=parametre, eklenmeyecek olan mevcut bağımlılıklar listesinin üzerine yazacaktır . Örneğin, eğer ServiceA zaten ServiceB'ye ve ServiceC'ye bağlıysa depend= ServiceD, çalıştırırsanız , ServiceA şimdi yalnızca ServiceD'ye bağlı olacaktır . (Teşekkürler Matt !)

Örnekler

Başka bir servise bağlılık:

sc config ServiceA depend= ServiceB

Yukarıdaki, ServiceA başlatılana kadar ServiceA'nın başlamayacağı anlamına gelir. ServiceB'yi durdurursanız, ServiceA otomatik olarak durur.

Diğer birçok hizmete bağımlılık:

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

Yukarıdaki, ServiceA'nın ServiceB, ServiceC ve ServiceD'nin tümü başlayana kadar başlamayacağı anlamına gelir. ServiceB, ServiceC veya ServiceD'den herhangi birini durdurursanız, ServiceA otomatik olarak durur.

Tüm bağımlılıkları kaldırmak için:

sc config ServiceA depend= /

Mevcut bağımlılıkları listelemek için:

sc qc ServiceA

5
Mevcut bağımlılıkları
Kip'in

1
Sadece dikkatli olun ... Sadece bunu kullandım ve mevcut bağımlılıkların üzerine yazacağının farkında değildim .. hizmetim için hatırlayamadığım iki tane vardı ... şimdi gittiler .. oh peki! Bu nedenle, önce diğer bağımlılıkları görmek için önce belirtilen komutunu çalıştırın.
Matt

1
Şu anda kullanarak bir hizmet için bağımlılık yapılandırılmış sorgulayabilir sc qc [service name]komutu
gerrytan

4
Benim gibi, Hizmetinizde adın boşlukları var, onu tırnak işaretleri içine alın.
Lazlow

6
Powershell kullanıyorsanız, sc.exeaksi halde kullandığınızdan emin olun, hata alırsınız: 'Argümanı kabul eden konumsal bir parametre bulunamıyor'
spuder

42

Servise "DependOnService" değerini ekleyerek servise bağımlılık ekleyebilirsiniz, regeditkomutunu kullanarak serviste kayıt altına alın HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>. Ayrıntılar , aşağıdakilerden bir alıntı olan MS KB makalesi 193888'de bulunabilir :

Yeni bir bağımlılık oluşturmak için, geciktirmek istediğiniz servisi temsil eden alt anahtarı seçin, Düzenle'yi ve ardından Değer Ekle'yi tıklatın. Veri türü REG_MULTI_SZ ile yeni bir değer adı "DependOnService" (tırnak işaretleri olmadan) oluşturun ve sonra Tamam'ı tıklatın. Veri iletişim kutusu göründüğünde, bu hizmetten önce başlatmayı tercih ettiğiniz hizmetlerin adını veya adlarını her bir satır için bir girişle yazın ve ardından Tamam'ı tıklatın.


7
Kutsal inek! Aldığım en hızlı cevap buydu. Ana sayfaya bile zar zor döndüm.
Rick

2

2008R2 / Win7 ve daha yeni sürümlerde çalışabilecek tamamen PowerShell (regedit veya sc.exe yok) yöntemini arıyordum ve şunu gördüm:

Kolay olanı PowerShell ile regedit yapmaktır:

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

Veya, WMI kullanarak:

$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ğişim Win32_Service sınıfının yöntemi çözümüne noktası oldu:

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

İsterseniz, hizmet bağımlılıklarını yönetmek için basit bir .net uygulaması yazdım. Bedava.

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


1
Bana .NET 1.1'e ihtiyacım olduğunu söylüyor ama Windows 7'yi çalıştırıyorum
Nick

1
Net 1.1, Windows 7'de yüklü olması gerekiyor. Bu sorunun cevabına bakın: answer.microsoft.com/en-us/windows/forum/…
Glenn Sullivan

9
Gerçekten de, 2014'te, yalnızca 4.0 için yeniden derlemek yerine, .NET 1.1'i Win7'ye yüklemenizi tavsiye ediyor musunuz? Teşekkürler, hayır.
Endrju

0

C ++ 'da (ATL) böyle yaptım

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.