Yüklemede otomatik olarak bir Windows Hizmeti başlatın


119

InstallUtil.exe kullanarak kurduğum bir Windows Hizmetim var. Başlangıç ​​Yöntemini Otomatik olarak ayarlamış olsam da, hizmet kurulduğunda başlamıyor, hizmetleri manuel olarak açmalı ve başlat'a tıklamam gerekiyor. Komut satırı veya Hizmetin kodu aracılığıyla başlatmanın bir yolu var mı?

Yanıtlar:


218

Installer sınıfınızda AfterInstall olayı için bir işleyici ekleyin. Ardından hizmeti başlatmak için olay işleyicisindeki ServiceController'ı çağırabilirsiniz.

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

Artık yükleyicinizde InstallUtil'i çalıştırdığınızda, hizmet otomatik olarak kurulacak ve ardından başlayacaktır.


40
(önerilen bir düzenlemeden açıklama): serviceInstaller.ServiceName'i kullanmak daha iyidir, eğer hizmet adı değiştirilirse kodda değiştirmeye gerek kalmadan doğru adı kullanır.
Marc Gravell

1
Ayrıca ServiceControllerbir kullanım ifadesini sarmalamak da zarar vermez .
ChrisO

3
ServiceInstaller'ı nasıl alıyorsunuz?
Philip Rego

1
serviceInstaller, ServiceInstallersınıfınızdaki değişken olmalıdır . Böyle bir sınıf uygulanacaktır System.Configuration.Install.Installer. Daha fazla bilgi için bu msdn kılavuzuna bakın .
Sergio Basurco

4
@PhilipRego Muhtemelen serviceInstaller, normalde yapıcıda örneklenen olay işleyicide ServiceInstalleratıfta bulunulan nesnedir . Bu nedenle ifadeden önce ekleyebilirsiniz . senderServiceInstaller()ServiceInstaller serviceInstaller = (ServiceInstaller)sender;using
khargoosh

28

Biraz yeniden düzenleme yaptıktan sonra, bu, otomatik başlatmalı eksiksiz bir Windows hizmeti yükleyicisine bir örnektir:

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
Bu kod bana aşağıdaki hataları verdi: Kurulum aşamasında bir istisna oluştu. System.InvalidOperationException: System.ServiceProcess.ServiceInstaller öğesinin OnAfterInstall olay işleyicisinde bir istisna oluştu. İç özel durum System.InvalidOperationException aşağıdaki hata iletisiyle oluşturuldu: '.' Bilgisayarında hizmet hizmeti başlatılamıyor. System.ComponentModel.Win32Exception iç özel durum aşağıdaki hata iletisiyle oluşturuldu: Bu hizmetin yapılandırıldığı yürütülebilir program çalıştırma hizmeti gerçekleştirmez.
goamn

2
"InitializeComponent ()" satırını yorumladığımda ele geçirilen hatalar. Bu satırın diğer tüm satırları kopyaladığına inanıyorum, çünkü günlükler hatadan önce iki aynı şeyi birlikte gösteriyor gibi görünüyor: service serviceName yükleniyor ... Service serviceName başarıyla yüklendi. Günlükte EventLog kaynak serviceName oluşturuluyor Uygulama ... Service serviceName yükleniyor ... Günlükte EventLog kaynak serviceName oluşturuluyor Application ... System.ServiceProcess.ServiceInstaller'ın OnAfterInstall olay işleyicisinde bir istisna oluştu.
goamn

Gerçekten günümü kurtardın :) Bu faydalı yorum için teşekkür ederim. InitializeComponent () çağrısını yorumladıktan sonra, hizmetim de mükemmel bir şekilde başladı
Konstantin

7

Komutları takip etmeye ne dersiniz?

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

Güzel. Bunu kurulum tamamlandıktan hemen sonra kurulum toplu iş dosyama yazdım.
M.Fawad Surosh

5

Hizmetleri kontrol etmek için programatik seçenekler:

  • Yerel kod "Hizmet Başlatma" olarak kullanılabilir . Minimum bağımlılıklarla maksimum kontrol, ancak çoğu iş.
  • WMI: Win32_Service'in bir StartServiceyöntemi vardır. Bu, diğer işlemleri gerçekleştirmeniz gereken durumlar için iyidir (örneğin, hangi hizmeti seçmek için).
  • PowerShell: Start-Servicearacılığıyla RunspaceInvokeveya kendiniz oluşturarak Runspaceve CreatePipelineyürütme yöntemini kullanarak çalıştırın. Bu, diğer işlemleri (örneğin hangi hizmeti seçmek için) WMI'dan çok daha kolay bir kodlama modeli ile gerçekleştirebilmeniz gereken durumlar için iyidir, ancak PSH'nin kurulmasına bağlıdır.
  • Bir .NET uygulaması, ServiceController

4

Hizmeti başlatmak için aşağıdaki komut satırını kullanabilirsiniz:

net start *servicename*

2

Hizmetinizi koddan başlatmak için ServiceController'ı kullanın .

Güncelleme: Ve servisi komut satırından başlatmanın daha doğru yolu , "net" yerine "sc" ( Servis Kontrolörü ) komutunu kullanmaktır.


6
"Sc" neden "daha doğru" bir yoldur? "Net start" (ve start-service PSH cmdlet) ile ilgili sorun nedir?
Richard

1
Sc uzak bir makineden çağrılabildiğinden, her zaman işe yarar.
MacGyver

1

Kabul edilen yanıtı tam olarak takip etsem de, hizmetin başlamasını sağlayamadım - bunun yerine, kurulum sırasında, this.serviceInstaller.ServiceNameyerine kullanılmasına rağmen mevcut olmadığı için henüz yüklenen hizmetin başlatılamadığını belirten bir hata mesajı aldım. tam anlamıyla ...

Sonunda komut satırını kullanan alternatif bir çözüm buldum:

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

Otomatik başlatma, hizmetin Windows başladığında otomatik olarak başlatıldığı anlamına gelir. Başkalarının da bahsettiği gibi, konsoldan başlatmak için ServiceController'ı kullanmalısınız.


Bunu yapmak istemiyorum. Bunu komut satırından veya Windows Hizmeti sınıflarından tek seferde yapmak istiyorum.
mickyjtwin

Üzgünüm, hatam, kontrol panelinden başlatma olasılığını açıkça dışladığınız noktayı kaçırdım.
Michael Klement

0

Tüm hizmetlerin bir dizisini almak için ServiceController sınıfının GetServicesyöntemini kullanabilirsiniz . Ardından, her bir hizmetin özelliğini kontrol ederek hizmetinizi bulun . Hizmetinizi bulduğunuzda, başlatmak için yöntemi arayın .ServiceNameStart

Ayrıca, Statusstart çağrılmadan önce hangi durumda olduğunu görmek için özelliği kontrol etmelisiniz (çalışıyor, duraklatılmış, durdurulmuş vb. Olabilir).


0

Tasarımcınızı bozdunuz. Yükleyici Bileşeninizi Yeniden Ekleyin. Bir serviceInstaller ve bir serviceProcessInstaller içermelidir. Başlangıç ​​Yöntemi özelliği Otomatik olarak ayarlanmış serviceInstaller, yüklendiğinde ve her yeniden başlatmanın ardından başlatılır.


0

Sadece bir not: Bir hizmet yükleyicisi ve proje yükleyicisi eklemek için formlar arabirimini kullanarak hizmetinizi farklı bir şekilde kurmuş olabilirsiniz. Bu durumda, serviceInstaller.ServiceName yazan yeri "tasarımcının adı" .ServiceName ile değiştirin.

Bu durumda özel üyelere de ihtiyacınız yok.

Yardım için teşekkürler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.