अगर C # में एक Windows सेवा स्थापित है, तो कैसे जांचें


79

मैंने एक Windows सेवा लिखी है जो एक WCF सेवा को उसी मशीन पर स्थापित GUI में उजागर करती है। जब मैं GUI चलाता हूं, अगर मैं सेवा से कनेक्ट नहीं कर सकता हूं, तो मुझे यह जानना होगा कि क्या यह है क्योंकि सेवा ऐप अभी तक इंस्टॉल नहीं किया गया है, या यदि यह सेवा नहीं चल रही है। यदि पूर्व, मैं इसे स्थापित करना चाहता हूं (जैसा कि यहां वर्णित है ); अगर बाद में, मैं इसे शुरू करना चाहता हूँ।

प्रश्न यह है: आप कैसे पता लगाते हैं कि क्या सेवा स्थापित है, और फिर पता चला कि यह स्थापित है, आप इसे कैसे शुरू करते हैं?

जवाबों:


147

उपयोग:

// add a reference to System.ServiceProcess.dll
using System.ServiceProcess;

// ...
ServiceController ctl = ServiceController.GetServices()
    .FirstOrDefault(s => s.ServiceName == "myservice");
if(ctl==null)
    Console.WriteLine("Not installed");
else    
    Console.WriteLine(ctl.Status);

धन्यवाद - बस मुझे क्या चाहिए!
शुल बेहार

1
का उपयोग कर (var sc = ServiceController.GetServices ()। FirstOrDefault (s => s.ServiceName == "myservice")) - मुझे लगता है कि यह एक बेहतर दृष्टिकोण है।
अलेक्जेंड्रू डिकू

4
@alexandrudicu: यह कैसे बेहतर दृष्टिकोण है? यदि .GetServices()100 ServiceControllerवस्तुओं को लौटाता है, और आपने बाकी की अनदेखी करते हुए सौ में से एक का निस्तारण किया है, तो क्या यह वास्तव में बेहतर है? मैं खुद ऐसा नहीं कहूंगा।
एलन ग्रेलनेक

37

आप निम्नलिखित का उपयोग कर सकते हैं ..

using System.ServiceProcess; 
... 
var serviceExists = ServiceController.GetServices().Any(s => s.ServiceName == serviceName);

3
IMO, यह जांचने का सबसे सुरुचिपूर्ण तरीका है कि आपकी सेवा मौजूद है या नहीं। कोड की सिर्फ एक पंक्ति, लिनक की शक्ति का लाभ उठाती है। और वैसे भी। कोई () एक बूल लौटाता है, जो वास्तव में आप एक हाँ / नहीं सवाल पूछने पर चाहते हैं :-)
एलेक्स एक्स।

3
यदि आपको दूरस्थ मशीन पर सेवाओं की जांच करने की आवश्यकता है, तो उपयोग करेंGetServices(string)
ShooShoSha

7

वास्तव में इस तरह पाशन:

foreach (ServiceController SC in ServiceController.GetServices())

यदि आपका एप्लिकेशन जिस खाते के अंतर्गत चल रहा है, उस तक पहुँच अस्वीकृत अपवाद फेंक सकता है, जिसके पास सेवा गुण देखने के अधिकार नहीं हैं। दूसरी ओर, आप सुरक्षित रूप से ऐसा कर सकते हैं, भले ही ऐसे नाम वाली कोई सेवा मौजूद न हो:

ServiceController SC = new ServiceController("AnyServiceName");

लेकिन अगर सेवा मौजूद नहीं है तो इसके गुणों तक पहुँचने के परिणामस्वरूप InvalidOperationException होगी। इसलिए यहां यह जांचने का एक सुरक्षित तरीका है कि कोई सेवा स्थापित है या नहीं:

ServiceController SC = new ServiceController("MyServiceName");
bool ServiceIsInstalled = false;
try
{
    // actually we need to try access ANY of service properties
    // at least once to trigger an exception
    // not neccessarily its name
    string ServiceName = SC.DisplayName;
    ServiceIsInstalled = true;
}
catch (InvalidOperationException) { }
finally
{
    SC.Close();
}

धन्यवाद! और क्या आप के साथ खत्म करना चाहते हैं: अंत में {SC.Close (); }
Cel

6
पूरी चीज़ को इस्तेमाल में क्यों नहीं लपेटते? यह अंत में {SC.Close ()} की आवश्यकता को हटा देगा क्योंकि एक उपयोग कथन स्वतः निपट जाएगा। का उपयोग कर (ServiceController SC = new ServiceController ("MyServiceName"))
बिल

2

गैर-लाइनक के लिए, आप इस तरह से सरणी को पुन: व्यवस्थित कर सकते हैं:

using System.ServiceProcess;

bool serviceExists = false
foreach (ServiceController sc in ServiceController.GetServices())
{
    if (sc.ServiceName == "myServiceName")
    {
         //service is found
         serviceExists = true;
         break;
    }
}

1

मुझे लगता है कि यह इस सवाल का सबसे अच्छा जवाब है। सेवा के मौजूद होने की पुष्टि करने के लिए अतिरिक्त प्रसंस्करण को जोड़ने की आवश्यकता नहीं है, क्योंकि यह अपवाद नहीं छोड़ता है यदि यह नहीं होता है। आपको बस इसे पकड़ने की जरूरत है। यदि आपको उपयोग करने में संपूर्ण विधि को लपेटना है तो आपको () को बंद करने की भी आवश्यकता नहीं है।

using (ServiceController sc = new ServiceController(ServiceName))
{
 try
 {
  if (sc.Status != ServiceControllerStatus.Running)
  {
    sc.Start();
    sc.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 10));
    //service is now Started        
  }      
  else
    //Service was already started
 }
 catch (System.ServiceProcess.TimeoutException)
 {
  //Service was stopped but could not restart (10 second timeout)
 }
 catch (InvalidOperationException)
 {
   //This Service does not exist       
 }     
}

2
बहुत अच्छा जवाब नहीं है। (1) अपवादों द्वारा प्रबंध कोड बहुत बुरा अभ्यास है - अक्षम और धीमा, और (2) स्वीकृत जवाब साफ है, संक्षिप्त है और आवश्यकताओं का पूरी तरह से जवाब देता है। क्या आपने अपने स्वयं के उत्तर के साथ गोता लगाने से पहले इसे देखा था?
शाऊल बेहार

जाहिर तौर पर आप यह नहीं जानते कि स्वीकार किए गए उत्तर की तरह कैसे पढ़ें, क्योंकि उन्होंने स्पष्ट रूप से पूछा कि सेवा कैसे शुरू की जाए, जो मूल उत्तर में शामिल नहीं था।
बिल

जाहिर है, आप ठीक से कोड लिखना नहीं जानते। जैसा कि @Shaul Behr ने पहले ही कहा था, आपका दृष्टिकोण बुरा है क्योंकि यह अक्षम और धीमा है। अपना स्वयं का उत्तर देना संभवतः सबसे अच्छा है, इसे और भी बदतर बना देता है: स्व-प्रशंसा को कभी भी एसओ (और शायद पूरी दुनिया में, यहाँ भी) एक अच्छा व्यवहार नहीं माना जाता है।
योदा

1
जाहिर तौर पर मुझे नहीं पता कि क्या बुरा है ... आपकी असमर्थता आपके प्रयास में उचित व्याकरण का उपयोग करने के लिए यह देखने के लिए कि आपको पता है कि आप क्या कह रहे हैं, या आपकी अक्षमता का एहसास आपको सिर्फ एक धागे पर 2014 से टिप्पणी करने के लिए हुआ .... लोल।
बिल

यह एकमात्र उत्तर है कि यदि कोई अपने अस्तित्व की जाँच करने और उसके साथ बातचीत करने के बीच में सेवा को हटाता है तो उसका क्या होता है
माइक कैरन

1
 private bool ServiceExists(string serviceName)
    {
        ServiceController[] services = ServiceController.GetServices();
        var service = services.FirstOrDefault(s => string.Equals(s.ServiceName, serviceName, StringComparison.OrdinalIgnoreCase));
        return service != null;
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.