본문 바로가기

TechLog

닷넷에서 윈도우 서비스 제어하기 ; ServiceController

닷넷에서 윈도우 서비스 제어하기 ; ServiceController

닷 넷에서는 서비스 서버 컨트롤을 시각적으로 제공하고, System.ServiceProcess.ServiceController 개체를 통해서 서비스에 액세스할 수 있는 수단을 제공하고 있습니다. ServiceController 개체의 간단한 사용법에 대하여 알아보겠습니다.

 

 

안녕하세요 : )

 

서버측 소프트웨어를 작성하다 보면, 서비스에 대한 제어가 필요한 경우가 많습니다. VS.Net의 경우 시스템에 존재하는 서비스에 접근할 수 있는 코드를 쉽게 만들 수 있습니다.

 

그럼 시작합니다 : )

 

 

서버 탐색기

 

    clip_image001

 

VS.Net 을 사용하고 있고, 서버측 애플리케이션 작성을 많이 하고 있다면, 아마 서버 탐색기 탭을 많이 사용하고 있을 것이다. SQL Server 아이콘에서 Drag'n Drop 만으로 SqlCommand 개체를 생성할 수 있다는 것 정도는 아마 알고 있겠지만, 서비스에 대한 접근도 가능하다는 것은 알고 있는가?

 

    clip_image002

 

MSSQLSERVER 서비스 아이콘을 끌어서 폼 위에 놓으면 serviceController1 개체가 생성된다. 그리고 다음과 같이 버튼을 하나 배치해보자 :

 

     clip_image003

 

이렇게 해 놓으면 사용할 준비는 끝났다. 다음과 같이 코딩해보자 :

 

private void button1_Click(object sender, System.EventArgs e)

{

    DialogResult result;

    switch(serviceController1.Status)

    {

        case System.ServiceProcess.ServiceControllerStatus.Stopped:

            result = MessageBox.Show(

                string.Format("{0} 서비스가 중지되어 있습니다. 시작하시겠습니까?", serviceController1.ServiceName),

                "서비스 중지",

                MessageBoxButtons.YesNo);

            if(result == DialogResult.Yes)

                serviceController1.Start();

            break;

        case System.ServiceProcess.ServiceControllerStatus.Running:

            result = MessageBox.Show(

                string.Format("{0} 서비스가 실행중입니다. 중지하시겠습니까?", serviceController1.ServiceName),

                "서비스 실행",

                MessageBoxButtons.YesNo);

            if(result == DialogResult.Yes)

                serviceController1.Stop();

            break;

    }

}

 

private void Form_Service_Load(object sender, System.EventArgs e)

{

    this.button1.Enabled = true;

    switch(serviceController1.Status)

    {

        case System.ServiceProcess.ServiceControllerStatus.Stopped:

            this.button1.Text =

                string.Format("{0} 서비스 시작", serviceController1.ServiceName);

            break;

        case System.ServiceProcess.ServiceControllerStatus.Running:

            this.button1.Text =

                string.Format("{0} 서비스 중지", serviceController1.ServiceName);

            break;

        default:

            this.button1.Enabled = false;

            break;

    }

}

 

코드 자체는 어렵지 않으므로 쉽게 이해할 수 있으리라 생각한다. 프로그램을 실행시키면 다음과 같은 폼이 나타난다 :

 

clip_image004

 

이런 식으로 서비스의 현재 상태를 체크할 수 있고, 시작/중지/일시 정지 등의 기능을 수행할 수 있으며, 서비스에서 미리 정의되어 있는 명령이 있다면 ExecuteCommand() 메서드를 사용해서 정의된 명령을 내릴 수도 있다.

 

 

정리

 

여러 서버의 서비스를 동시에 제어해야 한다거나, 원격에 있는 서비스를 제어하는 등 응용 가능성은 남겨놓도록 하겠습니다.

 

그럼 : )