Soru Hizmetin yüklü olduğu bir Windows Hizmetine bağımlılık nasıl eklenir?


SQL Server veritabanını kullanan bir Windows hizmetim var. Hizmetin yüklenmesi konusunda denetimim yok, ancak SQL sunucusunun başlatılmasından sonra başlatıldığından emin olmak için hizmete bağımlılık eklemek istiyorum. (SQL sunucusu söz konusu hizmetle aynı makinede çalışıyor)

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


118
2018-06-12 14:52


Menşei




Cevaplar:


Bu, ayrıca, bir yükseltilmiş komut istemi kullanılarak da yapılabilir. sc Komut. Sözdizimi şöyledir:

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

Not: Bir boşluk var sonra eşittir işareti ve var değil ondan önce.

Uyarı: depend= parametre üzerine mevcut bağımlılıklar listesi, eklenmez. Örneğin, ServiceA zaten ServiceB ve ServiceC'ye bağlıysa, depend= ServiceDServiceA şimdi bağlı olacak sadece ServiceD'de. (Teşekkürler Mat!)

Örnekler

Bir başka serviste bağımlılık:

sc config ServiceA depend= ServiceB

Yukarıdaki, ServiceB'nin ServiceB başlatana kadar başlamayacağı anlamına gelir. ServiceB'yi durdurursanız, ServiceA otomatik olarak duracaktır.

Birden fazla diğer hizmetlere bağımlılık:

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

Yukarıda ServiceA, ServiceC ve ServiceD her şey başlatana kadar ServiceA başlatılmayacağı anlamına gelir. ServiceB, ServiceC veya ServiceD'den herhangi birini durdurursanız, ServiceA otomatik olarak duracaktır.

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

181
2018-01-28 21:59



Başlangıçta kayıt defterini düzenlemeyi belirten cevabı seçtim. Fakat SC komutunu kullanmak, aradığım şeyle daha uyumlu. Teşekkürler. - Rick
Varolan bağımlılıkları Kip'in yöntemiyle değiştirmeden önce görmek isterseniz, sc qc YourServiceName yazabilirsiniz. - mivk
Sadece dikkatli ol ... Bunu kullandım ve var olan bağımlılıkların üzerine yazılacağını anlayamadım .. hatırlamadığım hizmetim için iki tane vardı .. şimdi gittiler .. oh iyi! Bu yüzden, önce diğer bağımlılıkları görmek için önce belirtilen mivk komutunu çalıştırdığınızdan emin olun. - Matt
Eğer benden hoşlanıyorsanız, Hizmetiniz adında boşluklara sahiptir, tırnak içine alın. - Lazlow
Powershell kullanıyorsanız, kullandığınızdan emin olun. sc.exe aksi halde hata alırsınız: 'Argümanı kabul eden bir konum parametresi bulunamadı' - spuder


Hizmet bağımlılıkları, kayıt defterindeki servise "DependOnService" değerini ekleyerek kullanarak ekleyebilirsiniz. regedit komut, hizmetler altında bulunabilir HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>. Ayrıntılar şu adreste bulunabilir: MS KB makalesi 193888Aşağıdakilerden bir alıntı aşağıdaki gibidir:

Yeni bir bağımlılık oluşturmak için   servisini temsil eden alt anahtar   Gecikmek istiyorum, Düzenle'yi tıklayın ve ardından   Değer Ekle'yi tıklayın. Yeni bir değer oluştur   adı "DependOnService" (olmadan   bir veri türü ile tırnak işaretleri)   REG_MULTI_SZ ve sonra Tamam'ı tıklatın. Ne zaman   Veri iletişim kutusu görüntülenir.   Hizmetlerin adını veya isimlerini   bu hizmetten önce başlamayı tercih ederim   her satır için bir giriş ile ve sonra   Tamam'ı tıklayın.


41
2018-06-12 14:53



Kutsal inek! Bu benim aldığım en hızlı cevaptı. Ana sayfaya geri döndüm. - Rick
+1 Teşekkürler, benim için çalıştı. - Rich


İlgilendiğinizde, 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
2018-01-31 16:38



Bana .NET 1.1'e ihtiyacım var diyor ama ben 7 pencereleri çalıştırıyorum - Nick
.Net 1.1, Windows 7'de yüklü olmalıdır. Bu sorunun cevabına bakınız: answers.microsoft.com/en-us/windows/forum/... - Glenn Sullivan
Gerçekten, 2014'te, sadece 4.0 için yeniden derlemek yerine, .NET 1.1'i Win7'ye yüklemeyi mi önerdiniz? Sağol, hayır. - Endrju


2008R2 / Win7 ve daha yeni üzerinde çalışabilen tamamen PowerShell (regedit veya sc.exe) yöntemini arıyordum ve bununla geldi:

Kolay bir PowerShell ile regedit yapmak:

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

Ya da 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şiklik Win32_Service sınıfının yöntemi, bir çözümün işaret edilmesine yardımcı 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
2018-02-13 03:40



Test; iyi çalışıyor. Paylaşım için teşekkürler. - CJBS


C ++ 'da (ATL) bunu beğendim

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