Windows

windows service install/uninstall

bitcoder 2022. 3. 4. 10:19
728x90

Visual Studio를 실행하고 "Empty Project"를 선택하고 Next를 누릅니다.

 

프로젝트 이름을 입력하고 Create를 누릅니다.

 

소스코드가 하나도 없는 비어있는(empty) 프로젝트입니다. 여기에 소스코드파일을 추가합니다.

 

"Solution Explorer"창의 "Source Files"에 마우스 오른쪽 버튼을 클릭하고 "Add" -> "New Item..."을 선택합니다.

추가하는 파일의 이름은 "main.cpp"로 하겠습니다. 입력하고 "Add"를 클릭합니다.

 

다음의 소스코드를 입력합니다. 소스코드의 간결성을 위해 에러처리코드는 포함하고 있지 않습니다.

#include <Windows.h>
#include <tchar.h>
#include <stdio.h>

#define SVCNAME TEXT("SvcName")

void SvcInstall(void)
{
	SC_HANDLE schSCManager, schService;
	TCHAR tszPath[MAX_PATH];

	GetModuleFileName(NULL, tszPath, MAX_PATH);
	schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
	schService = CreateService(schSCManager, SVCNAME, SVCNAME, SERVICE_ALL_ACCESS,
		SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
		tszPath, NULL, NULL, NULL, NULL, NULL);
	_tprintf(_T("Service installed\n"));
	CloseServiceHandle(schService);
	CloseServiceHandle(schSCManager);
}

void SvcDelete(void)
{
	SC_HANDLE schSCManager, schService;

	schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
	schService = OpenService(schSCManager, SVCNAME, DELETE);
	DeleteService(schService);
	_tprintf(_T("Service uninstalled\n"));
	CloseServiceHandle(schService);
	CloseServiceHandle(schSCManager);
}

int __cdecl _tmain(int argc, TCHAR* argv[])
{
	if (_tcscmp(TEXT("install"), argv[1]) == 0)
		SvcInstall();
	else if (_tcscmp(TEXT("delete"), argv[1]) == 0)
		SvcDelete();
}

 

솔루션을 빌드한 후 관리자권한으로 "cmd"창을 열고 다음과 같이 실행합니다.

 

다음 그림과 같이 services.msc를 실행합니다.

 

서비스목록 중에 설치된 "SvcName"을 확인할 수 있습니다.

 

이제 관리자권한으로 "cmd"창을 열고 다음과 같이 실행합니다.

 

 

다시 서비스 목록을 확인하면 설치되었던 서비스가 삭제되었음을 확인할 수 있습니다.

혹시 확인이 안된다면 리스트에서 우클릭을 하여 '새로 고침'을 선택하거나 F5를 눌러서 확인해보시기 바랍니다.

 

 

용어

- SCM : Service Control Manager

 

참고자료

https://docs.microsoft.com/en-us/windows/win32/services/the-complete-service-sample

 

The Complete Service Sample - Win32 apps

Learn more about: The Complete Service Sample

docs.microsoft.com

 

728x90