메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

Windows Server 2003의 명령줄 도구 맛보기

한빛미디어

|

2003-09-23

|

by HANBIT

16,554

저자: 『초보 윈도우 시스템 관리자를 위한 Windows Server 2003 실무 Bible』의 저자 문건석

윈도우가 제공하는 GUI 환경은 사용자가 원하는 작업을 수행하기에 이상적인 환경을 제공해준다. 이런 편의성 때문에 윈도우가 지금의 위치에 올랐다고 해도 과언은 아닐 것이다. 하지만 일반 사용자가 아닌 관리자의 관점에서 본다면 GUI 환경이 그렇게 좋은 것만은 아니라고 할 수도 있다. 관리자는 사용자, 그룹, 컴퓨터, 정책 등의 다양한 개체를 생성하고 유지, 보수해야 함은 물론 시스템의 상태정보를 수집하고 분석하는 작업도 수행하게 되는데, 이런 작업은 어떤 의미에서는 단순반복 작업인 경우가 많고, 더구나 한 두 대가 아닌 수십 수백 대의 시스템에서 동일한 작업을 해주어야 하는 일도 종종 발생하기 때문이다. 만일 명령줄 도구가 제공되지 않는다면 관리자는 작업을 위해 직접 각 컴퓨터 앞으로 가서 반복적인 일을 해야 할 것이다. (물론 GUI 도구도 원격 관리기능을 제공한다. 하지만 모든 작업이 가능한 것은 아니며, 반복작업을 자동화할 수 있는 기능을 가지지도 않는다.) 일례로, 수천 명의 사용자 계정을 생성해야 하는 관리자가 GUI 도구로만 작업을 해야 한다면 개별 계정을 생성하기 위해 엄청난 수의 마우스 클릭을 해야 할 것이고 과도한 클릭으로 인해 손가락 관절이 손상되는 웃지 못할 상황도 생길 수가 있는 것이다(이 작업을 자동화할 수 있는 명령줄 도구로는 ldifde, csvde, dsadd 등이있음). MS가 이런 상황을 인지하지 못한 것은 아니었기에 Windows 2000에서부터 스크립팅 관련 기능과 명령줄 도구를 다수 추가하려는 노력을 해왔으며 Windows Server 2003에도 60여 개의 새로운 명령줄 도구가 추가되어졌다. 단지 60여 개뿐인가 라는 생각을 할 수도 있겠지만 하나의 명령줄 도구가 지니는 다양한 옵션들까지 포함한다면 하고자 하는 작업의 대부분을 명령줄 도구를 통해 처리할 수 있게 되었다고 말할 수 있다.


초보 윈도우 시스템 관리자를 위한 Windows Server 2003 실무 Bible

참고 도서

초보 윈도우 시스템 관리자를
위한 Windows Server 2003
실무 Bible

문건석, 인연환, 장승진, 장원휘,
전효범, 정승일




명령줄 도구들을 제대로 숙지하고 올바르게 활용한다면 보다 능률적으로 자동화된 관리작업을 수행하는 것이 가능해진다. 하지만 안타깝게도 유닉스 및 리눅스 계열 관리자들과는 달리 윈도우 관리자들(특히 초보 관리자들)은 명령줄 도구와 그를 활용한 스크립팅 기능을 제대로 활용하지 못하고 있는 듯하다. 때문에 몇 가지 명령줄 도구들만이라도 살펴보는 기회를 마련하고 이를 통해 그 활용 가능성을 느낄 수 있었으면 하는 마음에서 이 기사를 작성하게 되었다.

실제 명령줄 도구를 활용하기에 앞서 한 가지 주의해야 할 점이 있다. 명령줄 도구들 중에는 .vbs 파일이 다수 존재하는데 이들은 반드시 CScript.exe로 실행되어야 한다. 사전에 설정을 해주지 않았다면 다음과 같은 메시지 창을 만나게 된다. 물론 해결방법이 제시되고 있으므로 실수를 한번 했더라도 이 메시지 창을 참고하여 관련 설정을 해주면 될 것이다.


매번 명령을 실행할 때마다 cscript C:\windows\system32\eventquery.vbs와 같이 입력하는 것보다는 eventquery라고 명령어만 입력하는 것이 훨씬 편리하므로 CScript가 기본 스크립트 호스트가 되도록 설정을 하겠다.


이제 본격적으로 새롭게 추가된 명령줄 도구를 살펴보도록 하자!

eventquery

윈도우 시스템에서 발생한 거의 모든 주요 이벤트는 로그로 남게 되고 이는 이벤트 뷰어를 이용하여 확인할 수가 있다. eventquery는 명령 프롬프트에서 로컬 혹은 원격 시스템에서 발생한 이벤트 로그로부터 원하는 종류의 이벤트나 이벤트 속성을 수집하여 보여준다. 명령 구문은 다음과 같다.

eventquery[.vbs] [/s 컴퓨터 [/u 도메인\사용자 [/p 암호]]] [/fi 필터이름] [/fo {TABLE | LIST | CSV}] [/r 이벤트범위 [/nh] [/v] [/l [APPLICATION] [SYSTEM] [SECURITY] ["DNS server"] [UserDefinedLog] [DirectoryLogName] [*] ]

다양한 매개 변수(옵션)가 제공되고 있는데 이들을 간략히 살펴보면 다음과 같다.

/s 컴퓨터: 원격 컴퓨터의 이름이나 IP 주소를 지정할 수 있으며 지정하지 않으면 로컬 컴퓨터가 선택된다.

/u 도메인\사용자: 사용자 혹은 도메인\사용자의 형식으로 지정한 사용자 계정의 권한으로 작업을 실행한다. 지정하지 않으면 현재 로그온한 사용자의 권한으로 실행된다.

/p 암호: /u 매개 변수에서 지정한 사용자 계정의 암호를 입력한다.

/fi 필터이름: 필터할 이벤트의 유형을 지정한다. 사용되는 필터이름과 연산자, 값은 다음과 같다.

필터이름:
Datetime: 이벤트 발생 시간 및 일자를 기준으로 할 때 지정한다. (mm/dd/yy(yyyy), hh:mm:ssAM(/PM))
Type: 이벤트 로그의 유형에 따라 지정한다. 유형에는 오류(ERROR), 정보(INFORMATION), 경고(WARNING), 성공(SUCCESS), 성공감사(SUCCESSAUDIT), 실패감사(FAILUREAUDIT) 등이 있다.
그 외에도 이벤트 ID, 이벤트 발생 사용자, 컴퓨터 원본, 분류 등을 지정하는 User, Computer, Source, Category 등이 존재한다.

연산자: eq(동등함), ne(동등하지 않음), ge(크거나 같음), le(같거나 작음), gt(보다 큰), lt(보다 작은)

/fo {TABLE | LIST | CSV}: 출력 포맷을 지정한다.

/r: 표시할 이벤트 범위를 지정한다. N은 가장 최근의 이벤트를 표시해준다. 즉, 2를 입력한 경우 가장 최근의 이벤트 2개를 표시해준다. 반대로 -N은 가장 오래된 이벤트를 표시해준다. 결국 -2는 가장 오래된 이벤트 2개를 표시하라는 의미가 된다. N1-N2와 같은 형식으로 일정범위내의 이벤트만을 표시하도록 할 수도 있다.

/v: 이벤트의 상세 정보가 출력되도록 지정한다.

/l [APPLICATION] [SYSTEM] [SECURITY] ["DNS server"] [UserDefinedLog] [DirectoryLogName] [*]: 모니터링할 대상 로그를 지정한다.

/?: 명령어 도움말을 표시한다.

명령어 매개변수가 실제 어떻게 사용될 수 있는지를 예를 통해 살펴보자.

현재 시스템의 시스템 로그에 존재하는 오류 로그를 확인해보려는 경우라면 "eventquery /fi "type eq error" /l system" 이라 입력하여 다음의 그림과 같은 결과를 얻을 수 있다.


필터이름으로 type가 지정되었고 eq(동등함) error을 보아 오류와 동등한 값 즉, 오류인 이벤트를 표시해달라는 구문임을 알 수 있다. 물론 /l system으로 시스템 로그가 그 대상임을 지정하였다.

몇 가지 예를 더 들어보자. dc2라는 컴퓨터의 보안 로그에서 이벤트 ID가 528인 로그를 살펴보고자 하는 경우에는 다음과 같이 입력하면 된다.

eventquery /s dc2 /l security /fi "id eq 528"

그런데 현재 로그온 한 사용자 계정의 권한으로 해당 작업을 수행할 수 없다면 어떻게 해야 할까? 충분한 권한이 있는 계정을 지정해주면 될 것이다.

eventquery /s cd2 /u ian /p P@ssw0rd /l security /fi "id eq 528"

가장 최근의 이벤트 10개를 보고자 한다면 /r 10 매개변수를 추가하면 된다.

eventquery /r 10 /l application

특정 시간이나 일자에 발생한 이벤트를 살펴보고자 한다면 Datetime 필터를 지정하는 것으로 원하는 결과를 얻을 수 있다.

eventquery /fi "Datetime eq 06/25/00,03:15:00AM/06/25/00,03:15:00PM" /l application
eventquery /fi "Datetime gt 08/03/00,06:20:00PM" /fi "id gt 700" /fi "Type eq warning" /l system

그런데, 대부분의 경우 출력되는 결과는 상당히 길기 때문에 명령프롬프트 상에서 모두 살펴보기가 불편하고 장기적인 모니터링을 위한 정보수집을 위해서도 이런 출력결과를 파일로 저장할 수 있기를 바랄 것이다. 이런 경우라면 다음과 같이 /fo 옵션을 활용하면 된다.

eventquery /fi "type eq error" /l system /fo csv > elogdump.csv

위의 예에는 출력포맷으로 csv를 지정하였다. 이는 엑셀과 같은 스프레드시트에서 불러들여 작업하기가 수월하기 때문이며 앞서 본것처럼 "table", "list"와 같은 다른 포맷으로 지정할 수도 있다.

schtasks

윈도우 시스템은 특정 일자, 특정 시간에 원하는 관리작업이 자동적으로 실행되도록 하는 작업 예약 기능을 제공한다. 기존에는 GUI를 이용하여 설정해왔지만 이제는 새로이 제공되는 schtasks 도구를 이용하여 명령프롬프트 상에서도 예약작업이 가능해졌다. schtasks는 새로운 예약 작업을 생성하는 것뿐만 아니라 기존의 예약을 변경하거나 작업을 실행 혹은 정지시키고 예약을 제거하는 등의 작업도 수행할 수 있다.

schtasks create: 예약 작업 생성
schtasks change: 예약 작업 변경
schtasks run: 예약 작업 실행
schtasks end: 예약 작업 정지
schtasks delete: 예약 작업 제거
schtasks query: 예약 작업 확인

각 구문은 도움말 및 지원 센터를 참조하기 바라며 여기에서는 예약 작업을 생성하는 것만 다루도록 하겠다. 바로 앞에서 예로든 eventquery의 결과를 CSV 파일로 저장하는 구문이 매일 오전 7시에 실행되어 관리자가 시스템 이벤트에 기록된 오류 로그를 명령 실행의 결과로 생성된 csv 파일을 열어 쉽게 확인할 수 있기를 바란다고 가정해보자. 이 작업을 위해서는 먼저 .bat 파일(배치 파일)을 생성하여야 한다. 메모장을 열고 다음과 같이 명령구문을 입력한다.

eventquery /fi "type eq error" /l system /fo csv > elogdump.csv

이를 sys_error_log.bat이라는 이름으로 c:\에 저장하자. 이제 명령프롬프트에서 다음을 입력한다.

schtasks /create /tn "sys_error_log" /tr c:\sys_error_log.bat /sc daily /st 07:00

/create은 예약작업을 생성함을 의미하고, /tn은 작업이름(taskname)을 지정한 것이다. 예약이 성공적으로 이루어지고 나면 여기에서 지정한 이름으로 작업이 예약된 것을 GUI 도구에서 확인할 수 있다. /tr은 실행할 명령이나 프로그램을 지정하는 옵션으로 앞에서 생성한 배치파일의 경로와 이름을 입력하였다. /sc는 일정의 유형을 지정하는 매개변수로 MINUTE, HOURLY, DAILY, WEEKLY, MONTHLY, ONCE, ONSTART, ONLOGON, ONIDLE 등을 지정할 수 있으며 여기에서는 매일 실행할 것이므로 daily를 입력한 것이다. 마지막으로 /st는 시작시간(starttime)을 의미한다. 24시간 형식(hh:mm)으로 입력해주면 된다.

엔터를 누르면 관리자의 암호를 입력하라는 프롬프트가 나타날 것이고 암호를 입력하고 다시 엔터를 누르면 성공적으로 예약이 되었다는 메시지가 나타날 것이다. 만일 현재 로그온한 계정이 아닌 다른 계정의 권한으로 실행되기를 바란다면 /u 옵션을 이용하여 해당 계정을 지정해주면 된다. 시작, 모든 프로그램, 보조 프로그램, 시스템 도구 순으로 접근하여 예약된 작업을 실행하면 명령프롬프트에서 생성한 예약 작업이 등록되어 있는 것을 확인할 수 있을 것이다.

systeminfo

관리자는 네트워크에 존재하는 다수의 서버와 클라이언트의 하드웨어 사양이 어떤지, 역할은 무엇인지, 패치는 어떤 것이 적용되어 있는지와 같은 정보를 수집해야 할 때가 있다. 그 예로 네트워크에 존재하는 Windows 98 컴퓨터들 중에서 Windows XP로 업그레이드 할 수 있는 사양의 컴퓨터를 찾고자 하는 경우나 보안 문제를 해결하는 새로운 패치가 적용되지 않은 컴퓨터를 찾고자 하는 경우를 들 수 있다. systeminfo 도구는 GUI 도구보다 간편하게 그리고 폭넓게 이용될 수 있으며 이를 통해 얻을 수 있는 정보는 하드웨어 사양에서부터 기본적인 설정정보, 패치 상태에 이르기까지 다양하다. 실례는 다음의 그림을 통해 확인할 수 있다. 원격 시스템의 정보는 "/s 서버이름" 옵션을 이용하면 된다.


출력된 결과를 파일로 저장하려는 때에는 다음의 구문을 사용하면 된다.

systeminfo /s com1 /fo csv > sysinfo.csv

tasklist

로컬 혹은 원격 시스템에서 현재 실행중인 프로세스들을 확인할 수 있다. 마찬가지로 원격 시스템에서 실행중인 프로세스들의 정보를 얻기 위해서는 "/s 서버이름" 옵션을 활용하면 된다.


taskkill

프로세스의 이미지 이름이나 PID(Process ID)를 이용하여 해당 프로세스를 종료시킬 수 있다. 역시 /s 옵션을 사용할 수 있다.

tasklist와 taskkill은 같이 활용함으로써 그 가치를 높일 수 있다. tasklist로 실행중인 프로세스를 확인하고 이 중에 부적절한 프로세스는 없는지를 점검한 다음, taskkill을 이용하여 해당 프로세스를 종료하면 된다. 물론 반응이 없는 프로세스를 강제 종료시키기 위한 방법으로도 이용될 수 있다.


위의 경우 이미지 이름을 이용하여 인터넷 익스플로러(IEXPLORE.EXE)를 종료하였기에 두 개의 프로세스가 모두 종료된 것을 볼 수 있다. 만일 이중 하나만을 종료시키려는 경우에는 해당 프로세스의 PID를 지정하면 된다. 사용할 수 있는 매개변수는 다음과 같다.

/s 컴퓨터: 원격 컴퓨터의 이름이나 IP 주소를 지정한다.
/u 도메인\사용자이름: 지정한 사용자의 권한으로 명령을 실행한다.
/p 암호: /u 매개 변수에서 지정한 사용자 계정의 암호를 입력한다.
/fi 필터이름: 종료할 프로세스 형식을 지정하는 필터를 입력한다.
/pid 프로세스ID: 종료할 프로세스의 PID를 지정한다.
/im 이미지 이름: 종료할 프로세스의 이미지 이름을 지정한다. 와일드카드(*) 사용가능.
/f: 프로세스를 강제 종료한다. 원격 프로세스는 이 매개변수 없이도 항상 강제 종료된다.
/t: 지정된 프로세스는 물론 해당 프로세스의 모든 하위 프로세스도 종료한다.

이제 위의 예제 구문이 강제로 이미지 이름이 iexplore.exe인 프로세스와 그 하위 프로세스를 종료한다는 의미임을 알 수 있을 것이다.

지금까지 살펴본 명령줄 도구는 몇 되지 않는다. 하지만 이것들만으로도 그 활용 가능성을 느끼기에는 충분하리라는 생각이 든다. 지면 관계상 보다 많은 명령줄 도구와 좀더 다양한 활용법에 대한 소개를 하지 못하는 점은 아쉽지만 여러분들이 더 이상 관리작업을 GUI에만 의존하지 않기를 바라는 필자의 마음을 전할 수 있다는 정도에서 만족을 해야 할 것 같다. 도움말 및 지원 센터에서 제공되는 HOWTO에는 이전과 달리 GUI에서의 작업 방법과 함께 명령줄에서의 작업방법도 제공되므로 이를 적절히 활용해보도록 하자. 아울러 WMI와 VBscript에 대한 학습도 추가로 이루어졌으면 하는 바램이다. 명령줄 도구는 그 자체로도 유용함을 가지지만 스크립팅 작업에 활용될 수 있다는 점에서 더 큰 가치를 지닌다는 사실을 기억해야 할 것이다.

참고자료
http://www.microsoft.com/korea/windowsserver2003/techinfo/overview/mgmtsrvcs.asp
TAG :
댓글 입력
자료실

최근 본 상품0