Windows सेवा पर निर्भरता जोड़ने के लिए कैसे सेवा स्थापित है


133

मेरे पास एक Windows सेवा है जो SQL सर्वर डेटाबेस का उपयोग करती है। सेवा की स्थापना पर मेरा नियंत्रण नहीं है, लेकिन यह सुनिश्चित करने के लिए सेवा पर निर्भरता जोड़ना चाहूंगा कि यह SQL सर्वर शुरू होने के बाद शुरू हो। (SQL सर्वर उसी मशीन पर चल रहा है जो प्रश्न में सेवा के रूप में है)

क्या एक निर्भरता जोड़ने या संभवतः रजिस्ट्री को सीधे संपादित करने का एक उपकरण है?

जवाबों:


199

यह कमांड का उपयोग करके एक उन्नत कमांड प्रॉम्प्ट के माध्यम से भी किया जा सकता है sc। वाक्य रचना है:

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

नोट : बराबर चिह्न के बाद एक जगह है , और इससे पहले कोई भी नहीं है।

चेतावनी : depend=पैरामीटर मौजूदा निर्भरता सूची को अधिलेखित करेगा , न कि परिशिष्ट। उदाहरण के लिए, यदि ServiceA पहले से ही ServiceB और ServiceC पर निर्भर करता है, यदि आप चलाते हैं depend= ServiceD, तो ServiceA अब केवल ServiceD पर निर्भर करेगा । (धन्यवाद मैट !)

उदाहरण

एक अन्य सेवा पर निर्भरता:

sc config ServiceA depend= ServiceB

ऊपर का अर्थ है कि ServiceB तब तक शुरू नहीं होगा जब तक ServiceB शुरू नहीं हो जाता। यदि आप ServiceB को रोकते हैं, तो ServiceA अपने आप बंद हो जाएगा।

कई अन्य सेवाओं पर निर्भरता:

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

ऊपर का अर्थ है कि ServiceA तब तक शुरू नहीं होगा जब तक ServiceB, ServiceC और ServiceD सभी शुरू नहीं हो जाते। यदि आप किसी भी ServiceB, ServiceC, या ServiceD को रोकते हैं, तो ServiceA अपने आप बंद हो जाएगा।

सभी निर्भरताएँ दूर करने के लिए:

sc config ServiceA depend= /

वर्तमान निर्भरताओं को सूचीबद्ध करने के लिए:

sc qc ServiceA

5
यदि आप किप की विधि के साथ उन्हें बदलने से पहले मौजूदा निर्भरताओं को देखना चाहते हैं, तो आप qc YourServiceName टाइप कर सकते हैं
mivk

1
बस सावधान रहें ... मैंने अभी-अभी इसका इस्तेमाल किया है और यह महसूस नहीं किया कि यह मौजूदा निर्भरता को अधिलेखित कर देगा .. मेरी सेवा के लिए दो थे जो मुझे याद नहीं हैं .. अब वे चले गए हैं .. ओह ठीक है! इसलिए सुनिश्चित करें कि आप पहले किसी अन्य निर्भरता को देखने के लिए पहले उल्लेखित @mivk कमांड चलाते हैं।
मैट

1
आप वर्तमान में sc qc [service name]कमांड का उपयोग करके किसी सेवा के लिए कॉन्फ़िगर की गई निर्भरता को क्वेरी कर सकते हैं
6

4
अगर मेरी तरह, आपकी सेवा के नाम में रिक्त स्थान हैं, तो इसे उद्धरण में संलग्न करें।
लेज़लो

6
यदि पॉवरशेल का उपयोग किया जाता है, तो सुनिश्चित करें कि आप उपयोग करते हैं sc.exeअन्यथा आपको त्रुटि मिलेगी: 'एक
स्थितिगत

42

आप regeditकमांड का उपयोग करके रजिस्ट्री में सेवा के लिए "DependOnService" मूल्य जोड़कर सेवा निर्भरता जोड़ सकते हैं , सेवाओं के तहत पाया जा सकता है HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>। विवरण एमएस केबी लेख 193888 पर पाया जा सकता है , जिसमें से निम्नलिखित एक अंश है:

एक नई निर्भरता बनाने के लिए, उस सेवा का प्रतिनिधित्व करने वाले उपकुंजी का चयन करें जिसे आप विलंब करना चाहते हैं, संपादन पर क्लिक करें और फिर मूल्य जोड़ें पर क्लिक करें। एक नया मान नाम "DependOnService" (उद्धरण चिह्नों के बिना) REG_MULTI_SZ के डेटा प्रकार के साथ बनाएं और फिर ठीक पर क्लिक करें। जब डेटा संवाद बॉक्स प्रकट होता है, तो उस सेवा का नाम या नाम लिखें जिसे आप प्रत्येक पंक्ति के लिए एक प्रविष्टि के साथ इस सेवा से पहले शुरू करना चाहते हैं और फिर ठीक पर क्लिक करें।


7
पवित्र गाय! मुझे अब तक का सबसे तेज़ जवाब मिला। मैं मुश्किल से होम पेज पर वापस आया।
रिक

2

मैं विशुद्ध रूप से PowerShell (कोई regedit या sc.exe) विधि की तलाश में था जो 2008R2 / Win7 और नए पर काम कर सके, और इसके साथ आया:

पॉवरशेल के साथ regedit करना आसान है:

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

या, 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)

बदलें Win32_Service वर्ग की विधि एक समाधान करने के लिए बिंदु में मदद की:

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

यदि आप रुचि रखते हैं, तो मैंने सेवा निर्भरता को प्रबंधित करने के लिए एक साधारण .net आवेदन लिखा है। यह निःशुल्क है।

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


1
यह मुझे बता रहा है कि मुझे .NET 1.1 की आवश्यकता है, लेकिन मैं
निक

1
.Net 1.1 को विंडोज 7 पर स्थापित करने की आवश्यकता है। इस प्रश्न का उत्तर देखें: उत्तर .microsoft.com
Glenn Sullivan

9
वास्तव में, 2014 में आप Win7 पर .NET 1.1 स्थापित करने की सिफारिश कर रहे थे, केवल 4.0 के लिए इसे फिर से शुरू करने के बजाय? धन्यवाद, नहीं।
एंडरजू

0

C ++ (ATL) में मैंने ऐसा किया

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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.