2009-06-24 7 views
103

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

답변

180

를 사용할 수 있습니다. 그런 다음 이벤트 핸들러에서 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을 실행하면 설치 한 다음 서비스를 시작합니다. 당신은 당신의 디자이너를 손상

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

(제안 된 수정 사항의 의견) : serviceInstaller.ServiceName을 사용하는 것이 더 좋으며 서비스 이름이 변경되면 코드에서 변경하지 않고 올바른 이름을 사용하게됩니다. –

+1

using 문에서'ServiceController'를 래핑하는 것도 아쉬운 일입니다. – ChrisO

+0

OnBeforeInstall에 서비스 설치 프로그램의 ID를 지정해야했습니다. serviceInstaller = serviceInstaller1과 같은 것; 여기서 serviceInstaller1은 디자이너의 ID입니다. OnBeforeInstall에서 이것을 수행하면 위의 작업이 완벽하게 수행되었습니다. 시도하지는 않았지만 ServiceInstaller() 호출에서도이 작업을 수행 할 수 있습니다. –

0

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

+0

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

+0

죄송합니다. 제 잘못, 제어판을 통해 시작할 가능성을 명시 적으로 배제한 부분을 놓쳤습니다. –

5

다음 명령은 어떻습니까?

net start *servicename* 
3

당신은 서비스를 시작하려면 다음 명령 줄을 사용할 수 있습니다.

업데이트 : 명령 줄에서 서비스를 시작하는 올바른 방법은 "net"대신 "sc"(Service Controller) 명령을 사용하는 것입니다.

2

사용 ServiceController 코드에서 서비스를 시작하기 :

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

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

+1

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

0

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

Status 속성을 검사하여 start (실행 중, 일시 중지됨, 중지됨 등)를 호출하기 전에 이미 어떤 상태인지 확인해야합니다. 제어 서비스에 대한

4

프로그래밍 옵션 :

  • 네이티브 코드가 "Starting a Service"을 사용 할 수 있습니다. 최소한의 의존성으로 최대의 제어가 가능하지만 대부분의 작업이 필요합니다.
  • WMI : Win32_ServiceStartService 메서드를가집니다. 다른 처리 (예 : 어떤 서비스 선택)를 수행 할 수 있어야하는 경우에 유용합니다.
  • PowerShell : Start-ServiceRunspaceInvoke 통해 실행하거나 자신의 Runspace을 만들고 CreatePipeline 메서드를 사용하여 실행하십시오. 이는 WMI보다 훨씬 쉽게 코딩 모델을 사용하지만 설치되는 PSH에 따라 다른 처리 (예 : 어떤 서비스 선택)를 수행 할 수 있어야하는 경우에 유용합니다.
  • .NET 응용 프로그램은 AfterInstall 이벤트에 대한 처리기를 추가하여 설치 클래스에서 ServiceController
23

조금 리팩토링 후이 자동 시작과 함께 완전한 Windows 서비스 설치의 예입니다.설치 프로그램 구성 요소를 다시 추가하십시오. serviceInstaller와 serviceProcessInstaller가 있어야합니다. 시작 방법 등록 정보가 자동으로 설정된 serviceInstaller는 설치할 때마다 그리고 다시 부팅 할 때마다 시작됩니다.

+1

이 코드는 다음과 같은 오류/s를 나타냅니다. 설치 단계에서 예외가 발생했습니다. System.InvalidOperationException : System.ServiceProcess.ServiceInstaller의 OnAfterInstall 이벤트 처리기에서 예외가 발생했습니다. 내부 예외 System.InvalidOperationException이 throw되었으며 다음 오류 메시지가 표시됩니다. 컴퓨터 '.'에서 service serviceName을 시작할 수 없습니다 .. 내부 예외 System.ComponentModel.Win32Exception이 다음 오류 메시지와 함께 throw되었습니다.이 서비스가 실행 가능한 프로그램 실행되도록 구성된 서비스가 서비스를 구현하지 않습니다. – goamn

+1

"InitializeComponent()"행을 주석 처리하면 오류가 발생합니다. 로그가 오류 이전에 함께 일어난 두 가지 동일한 일을 보여주는 것처럼이 줄은 다른 모든 줄을 복제하고 있다고 생각합니다. service serviceName 설치 ... service serviceName이 성공적으로 설치되었습니다. 로그 응용 프로그램에서 EventLog 원본 serviceName 만들기 ... 서비스 serviceName 설치 중 ... 로그 응용 프로그램에서 EventLog 원본 serviceName 만들기 ... System.ServiceProcess.ServiceInstaller의 OnAfterInstall 이벤트 처리기에서 예외가 발생했습니다. – goamn

+0

당신은 정말 내 하루를 저장 :)이 유용한 코멘트 주셔서 감사합니다. InitializeComponent() 호출을 주석 처리 한 후 내 서비스도 완벽하게 시작되었습니다. – Konstantin

0

:

1

정확하게 대답 한 내용에도 불구하고 서비스를 시작할 수 없었습니다. 설치 중에 설치되지 않은 서비스를 시작할 수 없다는 오류 메시지가 대신 표시되었습니다.

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

그냥 참고 : 당신이 사용하는 다른 서비스를 설정할 수도 ... 리터럴보다는 this.serviceInstaller.ServiceName를 사용에도 불구하고

나는 결국 명령 줄을 사용합니다 대체 솔루션을 발견 양식 인터페이스를 사용하여 서비스 설치 관리자와 프로젝트 설치 관리자를 추가합니다. 이 경우 serviceInstaller.ServiceName이 "name from designer".ServiceName 인 위치를 바꿉니다.

이 경우 개인 회원이 필요하지 않습니다.

도움 주셔서 감사합니다.