স্বয়ংক্রিয়ভাবে ইনস্টলে একটি উইন্ডোজ পরিষেবা শুরু করুন


119

আমার একটি উইন্ডোজ পরিষেবা রয়েছে যা আমি ইনস্টলটুল.এক্সই ব্যবহার করে ইনস্টল করি। যদিও আমি স্টার্টআপ পদ্ধতিটি স্বয়ংক্রিয়ভাবে সেট করেছি, ইনস্টল করার পরে পরিষেবাটি আরম্ভ হয় না, আমাকে ম্যানুয়ালি পরিষেবাগুলি খুলতে হবে এবং শুরুতে ক্লিক করতে হবে। কমান্ড লাইনের মাধ্যমে, বা পরিষেবা কোডের মাধ্যমে এটি শুরু করার কোনও উপায় আছে কি?

উত্তর:


218

আপনার ইনস্টলার শ্রেণিতে, আফটার ইনস্টল ইভেন্টটির জন্য একটি হ্যান্ডলার যুক্ত করুন। এরপরে আপনি পরিষেবাটি শুরু করতে ইভেন্ট হ্যান্ডলারে পরিষেবা নিয়ন্ত্রণকারীকে কল করতে পারেন।

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

void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
{
    ServiceInstaller serviceInstaller = (ServiceInstaller)sender;

    using (ServiceController sc = new ServiceController(serviceInstaller.ServiceName))
    {
             sc.Start();
    }
}

এখন আপনি যখন ইনস্টলারটিতে ইনস্টলটলটি চালান, এটি ইনস্টল হবে এবং তারপরে স্বয়ংক্রিয়ভাবে পরিষেবাটি শুরু করবে।


40
(প্রস্তাবিত সম্পাদনা থেকে মন্তব্য): সার্ভিস ইনস্টলারের সার্ভিসনাম ব্যবহার করা আরও ভাল, যদি সার্ভিসনামটি পরিবর্তিত হয় তবে কোডটিতে এটি পরিবর্তন না করে সঠিক নামটি ব্যবহার করবে।
মার্ক গ্র্যাভেল

1
এটি ServiceControllerব্যবহারের বিবৃতিতে মোড়ানোতেও ক্ষতি হবে না ।
ক্রিসও

3
আপনি কীভাবে পরিষেবা ইনস্টলার পাচ্ছেন?
ফিলিপ রেগো

1
সার্ভিস ইনস্টলারের ServiceInstallerআপনার ক্লাসে পরিবর্তনশীল হওয়ার কথা । এ জাতীয় শ্রেণি বাস্তবায়ন করবে System.Configuration.Install.Installer। আরও তথ্যের জন্য এই এমএসডিএন গাইড দেখুন।
সেরজিও বাসুরকো

4
@PhilipRego সম্ভবত serviceInstallerহয় ServiceInstallerবস্তু দ্বারা উল্লেখ করা senderইভেন্ট হ্যান্ডলার, যা স্বাভাবিকভাবে মধ্যে instantiated হয় ServiceInstaller()কন্সট্রাকটর। সুতরাং আপনি বিবৃতি ServiceInstaller serviceInstaller = (ServiceInstaller)sender;আগে যোগ করতে পারেন using
খারগুশ

28

কিছুটা রিফ্যাক্টরিং করার পরে, এটি স্বয়ংক্রিয়ভাবে শুরু হওয়া একটি সম্পূর্ণ উইন্ডোজ পরিষেবা ইনস্টলারটির একটি উদাহরণ:

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();
    }
}
}

2
এই কোডটি আমাকে নিম্নলিখিত ত্রুটি দিয়েছে / গুলি: ইনস্টল পর্বের সময় একটি ব্যতিক্রম ঘটেছে। System.In अवैधOperationException: সিস্টেম.সোর্সোপ্রসেস.সোর্সইইনস্টলার এর অনএফটারইনস্টল ইভেন্ট হ্যান্ডলারটিতে একটি ব্যতিক্রম ঘটে। অভ্যন্তরীণ ব্যতিক্রম সিস্টেম.অনুষ্ঠানিক অপশন এক্সসেপশনটি নিম্নলিখিত ত্রুটি বার্তার সাথে নিক্ষেপ করা হয়েছিল: কম্পিউটারে পরিষেবা পরিষেবা নাম শুরু করা যায় না '।' রান ইন সার্ভিস বাস্তবায়ন করে না।
goamn

2
ত্রুটিগুলি যখন আমি একবার "ইনিশালাইজ কম্পোনেন্ট ()" লাইনটিতে মন্তব্য করি তখন সেগুলি ধরা পড়ে। আমি বিশ্বাস করি যে লগগুলি ত্রুটির আগে দুটি অভিন্ন জিনিস একসাথে ঘটতে দেখায় বলে মনে হয় এই লাইনটি অন্য সমস্ত লাইনটিকে নকল করছে: পরিষেবা পরিষেবাদির নাম ইনস্টল করা হচ্ছে ... পরিষেবা পরিষেবা নাম সফলভাবে ইনস্টল করা হয়েছে successfully লগ অ্যাপ্লিকেশনটিতে ইভেন্টলগ উত্স পরিষেবা নাম তৈরি করা হচ্ছে ... পরিষেবা পরিষেবা নাম ইনস্টল করা হচ্ছে ... লগ অ্যাপ্লিকেশনটিতে ইভেন্টলগ উত্স পরিষেবা নাম তৈরি করা হচ্ছে ... সিস্টেম.সোর্সোপ্রসেস.সওয়ারসিআইনস্টলার এর অনএফটারইনস্টল ইভেন্ট হ্যান্ডলারটিতে একটি ব্যতিক্রম ঘটেছে।
goamn

আপনি সত্যিই আমার দিনটি সংরক্ষণ করেছেন :) এই দরকারী মন্তব্যের জন্য আপনাকে ধন্যবাদ। আমি ইনিশিয়াল কম্পোনেন্ট () কলটি মন্তব্য করার পরে, আমার পরিষেবাটিও পুরোপুরি শুরু হয়েছিল
কনস্টান্টিন

7

নিম্নলিখিত আদেশগুলি সম্পর্কে?

net start "<service name>"
net stop "<service name>"

কুল। ইনস্টলেশন ইনস্টলেশন শেষ হওয়ার পরে আমি এটি আমার ইনস্টলেশন ব্যাচ ফাইলে লিখেছিলাম।
এম ফাওয়াদ সুরোষ

5

পরিষেবাদি নিয়ন্ত্রণের জন্য প্রোগ্রামিক বিকল্পসমূহ:

  • নেটিভ কোড ব্যবহার করা যেতে পারে, "একটি পরিষেবা শুরু করা" । সর্বনিম্ন নির্ভরতা সহ সর্বাধিক নিয়ন্ত্রণ তবে সর্বাধিক কাজ।
  • ডাব্লুএমআই : উইন 32_সেসওয়ারের একটি StartServiceপদ্ধতি রয়েছে। এটি এমন ক্ষেত্রে ভাল যেখানে আপনার অন্যান্য প্রসেসিং সম্পাদন করতে সক্ষম হওয়া প্রয়োজন (উদাহরণস্বরূপ কোন পরিষেবা নির্বাচন করতে)।
  • পাওয়ারশেল: এর Start-Serviceমাধ্যমে RunspaceInvokeবা নিজের তৈরি Runspaceকরে CreatePipelineএবং কার্যকর করার জন্য এর পদ্ধতিটি ব্যবহার করে সম্পাদন করে। এটি ডাব্লুএমআইয়ের তুলনায় আরও সহজ কোডিং মডেল সহ অন্যান্য প্রসেসিং (যেমন কোন পরিষেবা নির্বাচন করতে) সক্ষম করতে হবে সে ক্ষেত্রে এটি ভাল তবে এটি পিএসএইচ ইনস্টল হওয়ার উপর নির্ভর করে।
  • একটি। নেট অ্যাপ্লিকেশন ব্যবহার করতে পারেন ServiceController

4

পরিষেবাটি শুরু করতে আপনি নিম্নলিখিত কমান্ড লাইনটি ব্যবহার করতে পারেন:

net start *servicename*

2

কোড থেকে আপনার পরিষেবা শুরু করতে পরিষেবাদি নিয়ন্ত্রণকারী ব্যবহার করুন ।

আপডেট: এবং কমান্ড লাইন থেকে পরিষেবা শুরু করার আরও সঠিক উপায় হ'ল "নেট" এর পরিবর্তে "স্ক" ( পরিষেবা নিয়ন্ত্রক ) কমান্ডটি ব্যবহার করা।


6
"স্ক" একটি "আরও সঠিক" উপায় কেন? "নেট স্টার্ট" (এবং স্টার্ট সার্ভিস পিএসএইচ সেন্টিমিলেট) কী ভুল?
রিচার্ড

1
কারণ sc একটি দূরবর্তী মেশিন থেকে কল করা যেতে পারে, তাই এটি সর্বদা কার্যকর হয়।
ম্যাকগাইভার

1

গ্রহণযোগ্য উত্তরটি যথাযথভাবে অনুসরণ করা সত্ত্বেও, আমি পরিষেবাটি আরম্ভ করতে অক্ষম হয়েছি - পরিবর্তে আমাকে ইনস্টলেশনের সময় একটি ব্যর্থতার বার্তা দেওয়া হয়েছিল যে উল্লেখ করে যে সবেমাত্র ইনস্টল করা পরিষেবাটি চালু করা যায়নি, এটি ব্যবহার 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();
    }

0

স্বয়ংক্রিয় প্রারম্ভের অর্থ উইন্ডোজ শুরু হওয়ার সাথে সাথে পরিষেবাটি স্বয়ংক্রিয়ভাবে শুরু হয়। অন্যরা যেমন উল্লেখ করেছে, কনসোল থেকে এটি শুরু করার জন্য আপনাকে পরিষেবা নিয়ন্ত্রণকারী ব্যবহার করা উচিত ler


আমি এই কাজ করতে চান না। আমি কমান্ড লাইন থেকে বা উইন্ডোজ পরিষেবা ক্লাসের মধ্যে থেকে একবারে এটি করতে চাইছি।
মিকিজেটউইন

দুঃখিত, আমার খারাপ, আমি বিন্দুটি মিস করেছি যেখানে আপনি কন্ট্রোল প্যানেলে এটি শুরু করার সম্ভাবনা স্পষ্টভাবে বাদ দিয়েছিলেন।
মাইকেল ক্লিমেন্ট

0

আপনি ব্যবহার করতে পারেন GetServicesপদ্ধতি ServiceController সব পরিষেবার একটি অ্যারের পেতে বর্গ। তারপরে, ServiceNameপ্রতিটি পরিষেবার সম্পত্তি পরীক্ষা করে আপনার পরিষেবাটি সন্ধান করুন । আপনি যখন আপনার পরিষেবাটি পেয়েছেন, Startএটি শুরু করার জন্য পদ্ধতিটি কল করুন ।

Statusকল শুরু করার আগে এটি ইতিমধ্যে কী অবস্থায় রয়েছে তা দেখার জন্য আপনার সম্পত্তিটিও পরীক্ষা করা উচিত (এটি চলমান, বিরতি দেওয়া, থামানো ইত্যাদি হতে পারে))।


0

আপনি আপনার ডিজাইনারকে কলুষিত করেছেন। আপনার ইনস্টলার অংশটি আবার যুক্ত করুন। এটিতে একটি পরিষেবা ইনস্টলার এবং একটি পরিষেবাপ্রসেস ইনস্টলারের থাকা উচিত। স্বয়ংক্রিয়ভাবে সেট করা সম্পত্তি স্টার্টআপ পদ্ধতি সহ সার্ভিস ইনস্টলারটি ইনস্টল করার পরে এবং প্রতিটি পুনরায় বুটের পরে শুরু হবে।


0

কেবলমাত্র একটি দ্রষ্টব্য: কোনও পরিষেবা ইনস্টলার এবং প্রকল্প ইনস্টলার যুক্ত করতে আপনি ফর্ম ইন্টারফেসটি ব্যবহার করে আপনার পরিষেবাটি আলাদাভাবে সেট আপ করতে পারেন। সেক্ষেত্রে এটি যেখানে সার্ভিস ইন্সটল.সেবারসনাম বলে সেখানে প্রতিস্থাপন করুন "নাম ডিজাইনারের নাম" সহ।

এক্ষেত্রে আপনার ব্যক্তিগত সদস্যদেরও দরকার নেই।

সাহায্যের জন্য ধন্যবাদ.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.