it-swarm.asia

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

Bir SQL Server veritabanı kullanan bir Windows hizmeti var. Hizmetin yüklenmesi üzerinde denetimim yok, ancak SQL Server başladıktan sonra hizmetin başlatılmasını sağlamak için hizmete bağımlılık eklemek istiyorum. (SQL sunucusu söz konusu hizmetle aynı makinede çalışıyor)

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

135
Rick

Bu, sc komutu kullanılarak yükseltilmiş bir Komut İstemi aracılığıyla da yapılabilir. Sözdizimi:

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

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

Uyarı : depend= parametresi eklenmeyecek mevcut bağımlılıklar listesinin üzerine yazacak . Örneğin, ServiceA zaten ServiceB ve ServiceC'ye bağlıysa, depend= ServiceD, ServiceA artık ServiceD'ye yalnızca bağlı olacaktır. (Teşekkürler Matt !)

Örnekler

Başka bir hizmete bağımlılık:

sc config ServiceA depend= ServiceB

Yukarıda, ServiceB başlatılana kadar ServiceA'nın başlatılmayacağı 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ıda ServiceA, ServiceB, ServiceC ve ServiceD başlatılana 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
203
Kip

regedit komutunu kullanarak kayıt defterindeki hizmete "DependOnService" değerini ekleyerek hizmet bağımlılıkları ekleyebilirsiniz, hizmetler HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>. Ayrıntılar MS KB makalesi 193888 adresinde bulunabilir, aşağıdakilerden bir alıntıdır:

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

42
pauska

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

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)

Win32_Service sınıfının Change yöntemi bir çözüme işaret etti:

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[]
);
2
JoeGasper

Eğer ilgileniyorsanız, 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
Glenn Sullivan

C++ (ATL) 'de 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
AndersK