c# - इंस्टॉल पर एक विंडोज सेवा स्वचालित रूप से शुरू करें




windows-services (8)

मेरे पास एक विंडोज सेवा है जिसे मैं InstallUtil.exe का उपयोग कर स्थापित करता हूं। भले ही मैंने स्टार्टअप विधि स्वचालित रूप से सेट की है, सेवा स्थापित होने पर प्रारंभ नहीं होती है, मुझे सेवाओं को मैन्युअल रूप से खोलना होगा और प्रारंभ क्लिक करना होगा। क्या इसे कमांड लाइन के माध्यम से या सेवा के कोड के माध्यम से शुरू करने का कोई तरीका है?


अपने इंस्टॉलर क्लास में, आफ्टर इंस्टाल ईवेंट के लिए एक हैंडलर जोड़ें। फिर सेवा शुरू करने के लिए आप ईवेंट हैंडलर में ServiceController को कॉल कर सकते हैं।

using System.ServiceProcess;

public ServiceInstaller()
{
    //... Installer code here
    this.AfterInstall += new InstallEventHandler(ServiceInstaller_AfterInstall);
}

void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
{
    using (ServiceController sc = new ServiceController(serviceInstaller.ServiceName))
    {
         sc.Start();
    }
}

अब जब आप अपने इंस्टॉलर पर InstallUtil चलाते हैं तो यह इंस्टॉल हो जाएगा और फिर सेवा शुरू करेगा।


आप सभी सेवाओं की सरणी प्राप्त करने के लिए ServiceController क्लास के GetServices विधि का उपयोग कर सकते हैं। फिर, प्रत्येक सेवा की ServiceName प्रॉपर्टी की जांच करके अपनी सेवा ServiceName । जब आपको अपनी सेवा मिलती है, तो इसे ServiceController करने के लिए ServiceController विधि पर कॉल ServiceController

आपको Status प्रॉपर्टी को यह भी देखने के लिए जांचना चाहिए कि कॉलिंग शुरू करने से पहले यह किस स्थिति में है (यह चल रहा है, रोका जा सकता है, रोका जा सकता है, आदि ..)।


कोड से अपनी सेवा शुरू करने के लिए ServiceController का उपयोग करें।

अद्यतन: और कमांड लाइन से सेवा शुरू करने के लिए और सही तरीका "नेट" के बजाय "एससी" ( सेवा नियंत्रक ) कमांड का उपयोग करना है।


थोड़ा सा रिफैक्टर करने के बाद, यह स्वत: प्रारंभ के साथ एक पूर्ण विंडोज सेवा इंस्टॉलर का एक उदाहरण है:

using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;

namespace Example.of.name.space
{
[RunInstaller(true)]
public partial class ServiceInstaller : Installer
{
    private readonly ServiceProcessInstaller processInstaller;
    private readonly System.ServiceProcess.ServiceInstaller serviceInstaller;

    public ServiceInstaller()
    {
        InitializeComponent();
        processInstaller = new ServiceProcessInstaller();
        serviceInstaller = new System.ServiceProcess.ServiceInstaller();

        // Service will run under system account
        processInstaller.Account = ServiceAccount.LocalSystem;

        // Service will have Start Type of Manual
        serviceInstaller.StartType = ServiceStartMode.Automatic;

        serviceInstaller.ServiceName = "Windows Automatic Start Service";

        Installers.Add(serviceInstaller);
        Installers.Add(processInstaller);
        serviceInstaller.AfterInstall += ServiceInstaller_AfterInstall;            
    }
    private void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
    {
        ServiceController sc = new ServiceController("Windows Automatic Start Service");
        sc.Start();
    }
}
}

बस एक नोट: आपने सेवा इंस्टॉलर और प्रोजेक्ट इंस्टॉलर जोड़ने के लिए फ़ॉर्म इंटरफ़ेस का उपयोग करके अपनी सेवा को अलग-अलग सेट अप किया होगा। उस मामले में जहां यह कहता है कि सेवा इंस्टॉलर। सेवा नाम "डिजाइनर से नाम" के साथ। सेवा नाम।

आपको इस मामले में निजी सदस्यों की भी आवश्यकता नहीं है।

सहायता के लिए धन्यवाद।


सेवा शुरू करने के लिए आप निम्न कमांड लाइन का उपयोग कर सकते हैं:

net start *servicename*

स्वचालित स्टार्टअप का अर्थ है कि विंडोज़ शुरू होने पर सेवा स्वचालित रूप से शुरू हो जाती है। जैसा कि अन्य ने उल्लेख किया है, इसे कंसोल से शुरू करने के लिए आपको ServiceController का उपयोग करना चाहिए।


स्वीकार्य उत्तर का पालन करने के बावजूद, मैं अभी भी सेवा शुरू करने में असमर्थ था - मुझे स्थापना के दौरान एक विफलता संदेश दिया गया था जिसमें कहा गया था कि जो सेवा अभी स्थापित की गई थी, उसे शुरू नहीं किया जा सका, क्योंकि यह अस्तित्व में नहीं था, इसका उपयोग this.serviceInstaller.ServiceName बावजूद this.serviceInstaller.ServiceName एक शाब्दिक के बजाय ...

अंततः मुझे एक वैकल्पिक समाधान मिला जो कमांड लाइन का उपयोग करता है:

private void serviceInstaller_AfterInstall(object sender, InstallEventArgs e) {
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        startInfo.FileName = "cmd.exe";
        startInfo.Arguments = "/C sc start " + this.serviceInstaller.ServiceName;

        Process process = new Process();
        process.StartInfo = startInfo;
        process.Start();
    }




windows-services