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


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

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


117
2018-06-12 14:52


मूल




जवाब:


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

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

ध्यान दें: एक जगह है बाद बराबर चिह्न, और वहाँ है नहीं इससे पहले एक।

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

उदाहरण

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

sc config ServiceA depend= ServiceB

उपरोक्त मतलब है कि सेवा ए शुरू होने तक सेवा ए शुरू नहीं होगा। यदि आप ServiceB को रोकते हैं, तो सेवा ए स्वचालित रूप से बंद हो जाएगा।

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

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

उपर्युक्त मतलब है कि सर्विसए तब तक शुरू नहीं होगा जब तक सर्विसबी, सर्विससी, और सर्विस डी शुरू नहीं हुआ है। यदि आप किसी भी सेवा बी, सेवासी, या सेवा डी को रोकते हैं, तो सेवा ए स्वचालित रूप से बंद हो जाएगा।

सभी निर्भरताओं को हटाने के लिए:

sc config ServiceA depend= /

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

sc qc ServiceA

180
2018-01-28 21:59



मैंने मूल रूप से उत्तर का चयन किया था कि रजिस्ट्री को कैसे संपादित किया जाए। लेकिन एससी कमांड का उपयोग करना जो मैं ढूंढ रहा था उसके अनुरूप है। धन्यवाद। - Rick
यदि आप किप की विधि के साथ उन्हें बदलने से पहले मौजूदा निर्भरताओं को देखना चाहते हैं, तो आप sc qc YourServiceName टाइप कर सकते हैं - mivk
बस सावधान रहें ... मैंने अभी इसका इस्तेमाल किया है और यह नहीं पता था कि यह मौजूदा निर्भरताओं को ओवरराइट करेगा .. मेरी सेवा के लिए दो थे जो मुझे याद नहीं है .. अब वे चले गए हैं .. ओह ठीक है! तो सुनिश्चित करें कि आप पहले किसी अन्य निर्भरता को देखने के लिए पहले उल्लेख किए गए कमांड @mivk चलाते हैं। - Matt
यदि मेरी तरह, आपकी सेवा के नाम पर रिक्त स्थान हैं, तो इसे उद्धरणों में संलग्न करें। - Lazlow
यदि पावरहेल का उपयोग करते हैं, तो सुनिश्चित करें कि आप इसका उपयोग करते हैं sc.exe अन्यथा आपको त्रुटि मिलेगी: 'एक स्थितित्मक पैरामीटर नहीं मिला है जो तर्क स्वीकार करता है' - spuder


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

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


41
2018-06-12 14:53



पवित्र गाय! यह अब तक का सबसे तेज़ उत्तर था। मैं मुश्किल से होम पेज पर वापस आ गया। - Rick
+1 धन्यवाद, मेरे लिए काम किया। - Rich


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

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


1
2018-01-31 16:38



यह मुझे बता रहा है कि मुझे .NET 1.1 की आवश्यकता है लेकिन मैं विंडोज 7 चला रहा हूं - Nick
.NET 1.1 को विंडोज 7 पर स्थापित करने की आवश्यकता है। इस प्रश्न का उत्तर देखें: answers.microsoft.com/en-us/windows/forum/... - Glenn Sullivan
वास्तव में, 2014 में आप 4.0 के लिए इसे पुनः संयोजित करने के बजाय Win7 पर .NET 1.1 स्थापित करने की सिफारिश कर रहे थे? धन्यवाद, नहीं। - Endrju


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

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

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

या, डब्ल्यूएमआई का उपयोग कर:

$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
2018-02-13 03:40



परीक्षण; अच्छा काम करता है। साझा करने के लिए धन्यवाद। - CJBS


सी ++ (एटीएल) में मैंने ऐसा किया था

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