sc.exe로 svnserve.exe를 NT 서비스로 직접 등록하는 방법

Subversion 1.4 시리즈 이후부터 가능한 것으로 sc.exe 유틸리티가 필요하다. sc.exe는 Visual Studio .NET / Visual Studio 2005을 설치하거나 Windows SDK 최신 버전을 설치하면 자동으로 포함된다.

sc.exe 유틸리티는 Windows NT 서비스에 관한 운영 체제의 API를 커맨드 라인 유틸리티의 형식으로 직접 노출한 것이기 때문에 매우 다양하고 구체적인 옵션을 제공한다. 그러나 아무렇게나 사용하면 완벽한 해킹 툴이 되기 쉽다. 쉽게 말해서 굉장히 예리한 도구이다.

sc.exe로 서비스를 등록하기

sc create [프로그래밍 ID 방식의 서비스 이름] binpath= “서비스로 실행할 실행 파일의 경로와 해당 파일에 전달할 매개 변수” displayname= “서비스 관리자 애플릿에서 표시할 정식 이름” depend= “다른 관련된 서비스의 ID” start= “시작 형태” obj= “서비스 시작에 사용할 Windows NT 계정 이름”

굉장히 긴 옵션들이다. 하지만 서비스 등록을 위하여 모두 필요한 사항이니 놓치면 안된다. 그리고 미리 이야기하자면 sc.exe의 명령줄 옵션은 문법이 까다로운 편이다. 등호 다음에 오는 공백은 sc.exe가 나름의 구문 분석 규칙을 정의해 놓은 것으로 이해하고 따라야 한다. 즉, sc.exe는 스위치 이름을 binpath, displayname과 같이 인식한다기보다 binpath=, displayname= 까지 인식한다고 보는 것이 정확하다.

sc create까지가 하나의 명령어라고 생각하면 편리하다. 그 다음에 오는 필수 인수가 [프로그래밍 ID 방식의 서비스 이름]이다. 여기에는 영문명만을 사용하는 것을 권장하며 영어 대/소문자를 구분하지는 않는다.

binpath는 서비스로 실행할 파일의 경로와 해당 실행 파일에 전달할 인수를 한꺼번에 지정하는 옵션이다. 파일 경로 상에 공백이 포함되면 따옴표로 묶는다는 것은 기본 상식이다. 하지만 이렇게 한 번 따옴표를 쓰고 나면 인수에는 따옴표를 전달할 수 없는게 아니냐는 고민에 빠지기 쉬운데 그런 고민은 할 필요 없다. 신경쓰지 말고 필요한 만큼 따옴표를 쓰면 된다. 하지만 너무 복잡한 따옴표 표기 규칙을 요구하면 잘못 전달될 수도 있다.

displayname은 서비스 관리자 애플릿 (services.msc)에서 표시할 이름을 의미한다. 서비스 관리자에서 알아볼 수 있는 편리한 이름을 정해서 기입하면 되며 한국어나 중국어와 같은 2바이트 언어를 사용하여도 무방하다.

depend는 이 서비스를 실행하기 위하여 필요한 다른 서비스의 ID를 써주는 곳이다. 여러 개의 서비스에 종속되어있다면 ‘/’ 기호를 써서 구분해주면 된다.

start는 이 서비스를 언제 실행할 것인가에 대한 사항을 적는 곳이다. 보통은 auto, demand 중 하나를 선택한다. auto는 시스템 서비스가 모두 시작되었으며 아직 로그인은 하지 않은 상태에서 실행하는 것을 말하며, demand는 어떤 형태로든 시스템에 대한 사용 권한을 얻은 이후에 직접 구동하는 것 (사용자가 아닌 프로그램에 의한 것도 포함하여)을 말한다. 다른 옵션으로는 disabled, boot, system이 있는데 boot와 system은 일반적인 Windows NT 서비스에는 적당하지 않다. boot와 system은 주로 장치 드라이버와 연관된 서비스나 운영 체제 핵심 서비스에만 한정되는 내용이다. disabled는 거의 쓸 일이 없으며 이름 그대로 “사용하지 않도록 등록한다”는 의미이다.

obj는 이 서비스를 실행할 사용자 계정을 지정하는 곳이다. 대개 서비스를 등록하는 것은 특정 사용자와는 무관하게 독립적으로 실행되기 위한 것이므로 NT AUTHORITYLocalService를 지정하면 적당하다. 하지만 직접 계정을 지정한다면 password 옵션을 써서 비밀 번호를 따로 지정해야 한다.

위의 설명에 따라서 svnserve.exe를 서비스로 등록하려면 다음과 같이 명령을 내리면 되겠다. %programfiles% 환경 변수를 사용하여 Program Files 폴더를 편리하게 지정할 수 있는데, 만약 이 환경 변수를 사용할 수 없다면 직접 기입해야 할 것이다.

sc create svnserve binpath= “%programfiles%Subversionbinsvnserve.exe –service –root “C:Repos”” displayname= “Subversion Server” depend= tcpip start= auto obj= “NT AUTHORITYLocalService”

이렇게 등록하고 서비스를 서비스 관리자에서 시작하면 TCP 포트를 점유한 상태로 시작할 것이다. 좀 더 자세한 내용은 svnserve.exe가 TCP 모드로 동작하는 경우를 살펴보면 되겠다.

sc delete로 서비스 제거하기

sc delete는 사용법이 간단하다.

sc delete [프로그래밍 ID 방식의 서비스 이름]

마찬가지로 [프로그래밍 ID 방식의 서비스 이름] 부분이 해당 서비스의 ID로 바뀌면 된다. 하지만 이 명령어를 사용할 때 챙겨야 할 것은 서비스를 종료한 상태에서 호출해야 한다는 점이다. 또한 여기에 올 수 있는 서비스는 Windows 핵심 서비스가 될 수도 있으므로 각별히 주의해야 하겠다.

댓글 남기기