설치시 자동으로 Windows 서비스 시작


119

InstallUtil.exe를 사용하여 설치 한 Windows 서비스가 있습니다. 시작 방법을 자동으로 설정했지만 설치시 서비스가 시작되지 않습니다. 수동으로 서비스를 열고 시작을 클릭해야합니다. 명령 줄이나 서비스 코드를 통해 시작할 수있는 방법이 있습니까?

답변:


218

Installer 클래스에서 AfterInstall 이벤트에 대한 처리기를 추가합니다. 그런 다음 이벤트 처리기에서 ServiceController를 호출하여 서비스를 시작할 수 있습니다.

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

이제 설치 프로그램에서 InstallUtil을 실행하면 서비스가 자동으로 설치되고 시작됩니다.


40
(제안 된 편집의 주석) : serviceInstaller.ServiceName을 사용하는 것이 더 좋습니다. 서비스 이름이 변경되면 코드에서 변경할 필요없이 올바른 이름을 사용합니다.
Marc Gravell

1
ServiceControllerusing 문 으로 감싸는 것도 나쁘지 않습니다 .
ChrisO 2013 년

3
serviceInstaller는 어떻게 받습니까?
Philip Rego

1
serviceInstaller는 ServiceInstaller클래스 의 변수 여야합니다 . 이러한 클래스는 System.Configuration.Install.Installer. 자세한 내용은이 msdn 가이드 를 참조하십시오.
Sergio Basurco

4
@PhilipRego 아마도 일반적으로 생성자 에서 인스턴스화되는 이벤트 처리기에서 참조 serviceInstaller하는 ServiceInstaller개체 입니다. 따라서 문 앞에 추가 할 수 있습니다 . senderServiceInstaller()ServiceInstaller serviceInstaller = (ServiceInstaller)sender;using
khargoosh

28

약간 리팩토링 한 후 자동 시작 기능이있는 완전한 Windows 서비스 설치 프로그램의 예입니다.

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.InvalidOperationException : System.ServiceProcess.ServiceInstaller의 OnAfterInstall 이벤트 처리기에서 예외가 발생했습니다. 내부 예외 System.InvalidOperationException이 다음 오류 메시지와 함께 발생했습니다. '.'컴퓨터에서 serviceName 서비스를 시작할 수 없습니다. 다음 오류 메시지와 함께 내부 예외 System.ComponentModel.Win32Exception이 발생했습니다.이 서비스가 구성된 실행 프로그램 실행은 서비스를 구현하지 않습니다.
goamn

2
"InitializeComponent ()"줄을 주석 처리하면 오류가 포착되었습니다. 로그에 오류가 발생하기 전에 두 가지 동일한 일이 함께 발생하는 것처럼 보이기 때문에이 줄은 다른 모든 줄을 복제하고 있다고 생각합니다. 서비스 설치 중 ... 서비스 서비스 이름이 성공적으로 설치되었습니다. 로그 애플리케이션에 EventLog 소스 serviceName 생성 중 ... 서비스 serviceName 설치 중 ... 로그 애플리케이션에 EventLog 소스 serviceName 생성 중 ... System.ServiceProcess.ServiceInstaller의 OnAfterInstall 이벤트 핸들러에서 예외가 발생했습니다.
goamn

당신은 정말 내 하루를 저장했습니다 :)이 유용한 의견에 감사드립니다. 내가 InitializeComponent를 () 호출에서 주석 한 후, 내 서비스도 완벽하게 시작
콘스탄틴

7

다음 명령은 어떻습니까?

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

멋있는. 설치가 완료된 직후 설치 배치 파일에 이것을 작성했습니다.
M. Fawad Surosh

5

서비스 제어를위한 프로그래밍 옵션 :

  • 네이티브 코드는 "서비스 시작"을 사용할 수 있습니다 . 최소한의 종속성으로 최대한의 제어가 가능하지만 대부분의 작업이 수행됩니다.
  • WMI : Win32_Service 에는 StartService메서드가 있습니다. 이것은 다른 처리를 수행 할 수 있어야하는 경우에 유용합니다 (예 : 서비스 선택).
  • PowerShell은 : 실행 Start-Service을 통해 RunspaceInvoke나 자신을 만들어 Runspace그 사용하여 CreatePipeline실행하는 방법을. 이는 WMI보다 훨씬 더 쉬운 코딩 모델로 다른 처리 (예 : 서비스 선택)를 수행 할 수 있어야하지만 설치되는 PSH에 따라 달라지는 경우에 유용합니다.
  • .NET 응용 프로그램은 다음을 사용할 수 있습니다. ServiceController

4

다음 명령 줄을 사용하여 서비스를 시작할 수 있습니다.

net start *servicename*

2

ServiceController 를 사용 하여 코드에서 서비스를 시작하십시오.

업데이트 : 명령 줄에서 서비스를 시작하는보다 정확한 방법 은 "net"대신 "sc"( 서비스 컨트롤러 ) 명령을 사용하는 것입니다.


6
"sc"가 "더 정확한"방법 인 이유는 무엇입니까? "net start"(및 start-service PSH cmdlet)의 문제점은 무엇입니까?
Richard

1
sc는 원격 시스템에서 호출 할 수 있으므로 항상 작동합니다.
MacGyver 2015

1

정확히 허용 대답을 다음에도 불구하고, 나는 아직도 대신이 존재하지 않는 것처럼 방금 설치 한 서비스 사용에도 불구하고, 시작할 수 없다는 설치하는 동안 오류 메시지가 주어진 I를 start-- 할 수있는 서비스를받을 수 없습니다 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

자동 시작은 Windows가 시작될 때 서비스가 자동으로 시작됨을 의미합니다. 다른 사람들이 언급했듯이 콘솔에서 시작하려면 ServiceController를 사용해야합니다.


나는 이것을하고 싶지 않다. 명령 줄 또는 Windows 서비스 클래스 내에서 한 번에이 작업을 수행하려고합니다.
mickyjtwin

죄송합니다. 제어판에서 시작할 가능성을 명시 적으로 배제한 지점을 놓쳤습니다.
Michael Klement 2009-06-24

0

ServiceController 클래스 의 GetServices메서드를 사용하여 모든 서비스의 배열을 가져올 수 있습니다. 그런 다음 각 서비스 의 속성을 확인하여 서비스를 찾으십시오 . 서비스를 찾으면 메서드를 호출하여 시작합니다.ServiceNameStart

또한 Statusstart를 호출하기 전에 속성을 확인하여 이미 어떤 상태인지 확인해야합니다 (실행 중, 일시 중지됨, 중지됨 등).


0

당신은 당신의 디자이너를 타락 시켰습니다. 설치 프로그램 구성 요소를 다시 추가하십시오. serviceInstaller 및 serviceProcessInstaller가 있어야합니다. 시작 방법 속성이 자동으로 설정된 serviceInstaller는 설치시와 재부팅 할 때마다 시작됩니다.


0

참고 : 서비스 설치 프로그램 및 프로젝트 설치 프로그램을 추가하기 위해 양식 인터페이스를 사용하여 서비스를 다르게 설정했을 수 있습니다. 이 경우 serviceInstaller.ServiceName을 "name from designer".ServiceName으로 바꾸십시오.

이 경우 개인 구성원도 필요하지 않습니다.

도와 주셔서 감사합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.