CMD 명령어를 보면 이미 시스템 정보에 대해서 출력해주는 명령어가 있는대요

대표적으로 systeminfo와 dxdiag가 있겠내요

systeminfo는 CMD창에서 결과를 바로 출력해주고

dxdiag는 기본이 GUI로 창을 띄워 보여주긴하지만 옵션을 주면 파일로 저장이 가능하죠

 

컴퓨터 정보를 가져올 필요가 생겨서 저 두 녀석을 가지고 이리저리 배치파일을 만들어봤지만

systeminfo 같은 경우에는 설치된 OS 언어에 따라 따로 작성을 해야하는 단점이 있고..

dxdiag 같은 경우에는 영어로 저장이 되서 괜찮긴한데 제가 원하는 정보를 쏙쏙 빼오기는 너무 방대하더라구요..

그래서 찾다가 저번에 Cacti Template 만들 때 사용했던 WMI가 생각나더라구요

WMI도 처음에 배치파일 작성하다가 포기할까도 했는데 생각보다 빠르고 손 쉽게 작성이 되더라구요.

 

제가 필요했던 정보는

컴퓨터이름

IP주소

OS 버전(2003, 2008, 2008 R2 ...)

OS 아키텍쳐(32bit, 64bit)

OS 서비스팩 버전

OS 마지막 업데이트 날짜

물리 메모리 총 용량

CPU 갯수(물리적으로 박혀있는 갯수가 아니라 실질적으로 동작하는 프로세서 수)

HDD 파티션별 총 용량

IIS or Apache 존재 유무 및 버전

이렇게 정보가 필요했습니다.(DB관련도 필요한데 이건 아직 해결을 못했내요..)

 

아래 써있는 배치파일 내용을 보면 아시겠지만 주로 WMIC를 이용해서 정보를 꺼내왔고

for /f를 이용해서 원하는 값만 추려내 출력해주는 방법입니다.

 

for문은 CMD에 for /?라고만 쳐도 자세히 나오니 설명은 생략하겠습니다.

소스 내용 자체가 특별히 어려운 것 없이 WMIC를 이용하고 있어서 자세하게 설명은 안하겠습니다.

포스팅하면서 추가된 설명부분은 기울여놨습니다.

 

-------------------------------------------systeminfo_wmic.bat-------------------------------------------

@echo off
setlocal enableextensions enabledelayedexpansion

 

rem Language 확인
for /f "tokens=2 delims==" %%a in ('wmic os get oslanguage /format:list') do set lang=%%a

::중간에 IP주소 확인할 때 한글OS인지 아닌지 필요한데 그 때 사용하기 위해 작성

 

REM OS 버전 & 아키텍처
for /f "tokens=3-9 delims== " %%a in ('wmic os get caption /format:list') do set os_1=%%a&set os_2=%%b&set os_3=%%c&set os_4=%%d&set os_5=%%e&set os_6=%%f&set os_7=%%g
set osver=%os_1% %os_2% %os_3% %os_4% %os_5% %os_6% %os_7%

::변수가 쓸데없이 많이 써져있는데 이건 .. OS별로 풀네임 길이가 다른 이유로 최대치를 몇 개로 잡아야할지 몰라서 막 생성했습니다.

::좀 귀찮았던 것도 있구요

 

set osarch=x64
set wow64="%windir%\SysWOW64"
if not exist %wow64% set osarch=x86

::아키텍쳐 판별하는 부분인데 64비트에서만 있는 SysWOW64가 존재하는지 판별

 

REM HOSTNAME
set hname=%computername%
rem echo %hname%


REM IP ADDRESS
if %lang%==1042 (
IPCONFIG |FIND "IPv4 주소 . . . . . . . . . : 1" > %TEMP%\TEMP_DAT.txt
FOR /F "tokens=2 delims=:" %%a in (%TEMP%\TEMP_DAT.txt) do set IP=%%a
del %TEMP%\TEMP_DAT.txt
set IP=%IP:~1%
)
if %lang%==1033 (
IPCONFIG |FIND "IPv4 Address. . . . . . . . . . . : 1" > %TEMP%\TEMP_DAT.txt
FOR /F "tokens=2 delims=:" %%a in (%TEMP%\TEMP_DAT.txt) do set IP=%%a
del %TEMP%\TEMP_DAT.txt
set IP=!IP:~1!
)

::IP주소 구하는 부분인데.. 이 부분은 NIC가 두 개 이상이라면 꽤 수정을 해야되는 부분입니다.

::저는 필요한게 하나의 NIC에 대한 IP주소기 때문에 이렇게 작성한거구요.

::NIC 두 개 이상인 PC의 IP주소를 모두 출력하고 싶으신 분은 다르게 작성해야하지 않을까 싶습니다.

 

rem Memory
for /f "tokens=2 delims==" %%a in ('wmic computersystem get totalphysicalmemory /format:list') do set mem=%%a
set /a mem=%mem:~0,-4% / 1024
set /a mem=%mem% / 1024

::배치파일은 안타깝게도 큰 숫자에 대한 연산이 안됩니다.(2^31 = 2,147,483,648) 즉 2147483648보다 큰 숫자는 연산을 할 수가 없습니다.

::그래서 어차피 GB로 변환할 때 1000 으로 나누면 없어질 3자리는 미리 출력을 안하도록 하고 변환 작업을 진행합니다.

 

rem hdd
::for /f "tokens=2-3 delims= " %%a in ('wmic logicaldisk get filesystem^,name^,size ^| find "NTFS"') do set ::size_byte=%%b&set /a size_GB=!size_byte:~0,-3!/1048576&set label=%%a&set hdd_cap=!hdd_cap!!::label:~0,1!!size_GB!

rem hdd
for /f "tokens=2-3 delims= " %%a in ('wmic logicaldisk get filesystem^,name^,size ^| find "NTFS"') do (
set size_byte=%%b
set len=0
rem TB 인지 아닌지 검사
for /L %%i in (0,1,15) do (
 set len_1=!size_byte:~%%i,1!
 if "!len_1!" NEQ "" set /a len=!len!+1
 if !len!==13 (set /a size_GB=!size_byte:~0,-4!/1048576&set size_GB=!size_GB!0)else (set /a size_GB=!size_byte:~0,-3!/1048576)
 if !len!==14 (set /a size_GB=!size_byte:~0,-5!/1048576&set size_GB=!size_GB!00)else (set /a size_GB=!size_byte:~0,-3!/1048576)
 if !len!==15 (set /a size_GB=!size_byte:~0,-6!/1048576&set size_GB=!size_GB!000)else (set /a size_GB=!size_byte:~0,-3!/1048576)
) 2>nul
set label=%%a
set hdd_cap=!hdd_cap!!label:~0,1!!size_GB!
)

::HDD 정보 구하는 부분인데... 진짜 지저분하내요.. 각 PC마다 파티션이 어떤 이름을 가지고 있을지 모르니 라벨명을 구하고

::그에 대한 용량을 구해서 메모리처럼 GB단위로 변환합니다.

::그리고 하나의 변수에 저장을 시켜버리는 과정입니다. 출력 결과는 C100D400 이런식으로 나옵니다.

::소스 부분 밑에 결과 이미지 첨부해놓을테니 참고하세요

::그리고 중간에 테라바이트인지 아닌지 확인하는 부분이 있어서 더욱 지저분해보이는데요

::원하는 출력형태에 단위를 표시하지 않기때문에 GB단위의 값이 필요해서 테라바이트가 넘어가는 숫자들은

::변환 후 뒤에 0을 더 붙여주는 식으로 100TB 까지 표현가능하게 되어있습니다.

::PB까지 필요하신분은 'rem TB인지 아닌지 검사' 밑에 for문의 15를 16으로 바꿔주시고 한 줄 더 추가하시면 되겠내요.

::아니면 아예 단위 변환하는걸 수정하셔도..


rem Service Pack Info
for /f "tokens=2 delims==" %%a in ('wmic os get servicepackmajorversion /format:list') do set sp=%%a
set sp=SP%sp%
if %sp%==SP0 set sp=N/A


rem Processor
for /f "tokens=2 delims==" %%a in ('wmic computersystem get numberoflogicalprocessors /format:list 2^>nul') do set lo_processors=%%a
if "%lo_processors%"=="" (for /f "tokens=2 delims==" %%a in ('wmic computersystem get numberofprocessors /format:list 2^>nul') do set lo_processors=%%a )

::CPU 정보인데요. if문을 사용한 이유는 첫번째 for문에 있는 wmic 명령줄은 Windows Server 2008 이후에 있는 값이기 때문에

::if를 이용해서 최초 변수에 값이 없는 경우에 2003 의 명령줄로 실행되게 해주는 부분입니다.

 

rem Processor Clock
for /f "tokens=2 delims==" %%a in ('wmic cpu get maxclockspeed /format:list 2^>nul') do set cpu_hz=%%a
set clock_1=%cpu_hz:~0,1%
set clock_2=%cpu_hz:~1,2%

::CPU 클럭 수치인대요 이 부분은 제가 원하는 출력형태가 x.xx 인데  최초 출력형태는 4자리 정수로 나오기 때문에

::변수를 두개 이용했습니다.

 

rem IIS 존재유무
set iis_exist=IIS EXIST
set iis_fd=%windir%\system32\inetsrv\InetMgr.exe
if not exist %iis_fd% set iis_exist=IIS NOT EXIST

::단순하게 작성했습니다. IIS 설치하면 생기는 inetmgr이 존재하는지 판별하게 합니다.

 

rem IIS 존재하면 Version 체크
if "%iis_exist%"=="IIS EXIST" (
reg query "HKLM\SOFTWARE\Microsoft\InetStp" /v "SetupString" > %TEMP%\iis_ver.txt
type %TEMP%\iis_ver.txt | find "IIS" > %TEMP%\iis_sion.txt
for /f "tokens=3-4 delims= " %%a in (%TEMP%\iis_sion.txt) do set iis_ver=%%a&set iis_sion=%%b
del %TEMP%\iis_ver.txt
del %TEMP%\iis_sion.txt
)
if "%iis_ver%" NEQ "" set iis_version=%iis_ver% %iis_sion%

::위에 IIS존재유무에서 존재한다고 판별이되면 버전검사를 합니다.

::이 부분은 WMIC에 따로 없는 듯하여 찾아보니 레지스트리에서 답을 찾게 됬고 바로 작성을 했습니다.

 


rem Apache 존재유무
tasklist | find "httpd" > %TEMP%\apache_exist.txt
for /f "delims=" %%a in (%TEMP%\apache_exist.txt) do set apa_che=%%a
del %TEMP%\apache_exist.txt
set apa_exist=APACHE EXIST
if "%apa_che%"=="" set apa_exist=APACHE NOT EXIST

::이 부분 역시 단순하게 실행중인 프로세스 중에 httpd가 있으면 아파치가 설치됬다고 판단합니다.

::물론 이 부분이 제일 불완전하다고 생각합니다.


rem Apache Version
if "%apa_exist%"=="APACHE EXIST" (
httpd -v | find "Apache" > %TEMP%\apa_version.txt
for /f "tokens=3 delims= " %%a in (%TEMP%\apa_version.txt) do set apa_ver=%%a
del %TEMP%\apa_version.txt
)
if "%apa_ver%" NEQ "" set apache_version=%apa_ver%

::IIS와 마찬가지로 존재한다고 판별이되면 httpd 명령을 통해 버전을 구해줍니다.

 

rem OS Last Update Time
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\Results\install" /v "LastSuccessTime" > %TEMP%\last_update.txt 2>nul
for /f "tokens=3 delims= " %%a in ( %TEMP%\last_update.txt) do set last_uptime=%%a
if "%last_uptime%"=="" set last_uptime=Not Update!!
del %TEMP%\last_update.txt

::이 부분도 IIS 버전 체크와 비슷하게 레지스트리를 이용합니다.

::wmic를 아무리봐도 답이 없을 것 같아 검색을 해봤더니 친절하게도 레지에 날짜가 등록되어있더군요.

 

 

echo.HOSTNAME: %hname%
echo.IP ADDRESS: %IP%
echo.OS VERSION: %osver%
echo.OS Architecture: %osarch%
echo.TOTALMEMORY: %mem%GB
echo.NUMBEROFPROCESSORS: %clock_1%.%clock_2%*%lo_processors%
echo.IIS: %iis_exist% %iis_version%
echo.APACHE: %apa_exist% %apache_version%
echo.HDD: %hdd_cap%
echo.OS LAST UPDATE TIME: %last_uptime%

:end
endlocal
pause

 

-------------------------------------------systeminfo_wmic.bat-------------------------------------------

단순 노동으로 작성해서 그렇게 어려운 부분은 없을 것 같내요.

이 정보들 외에 따로 필요하신 것 있으시면 wmic 명령줄만 수정하시면 되구요

그렇게 중요하고 참신한 배치파일은 아니지만 나름 공부는 되었내요 ~

마지막으로 출력결과 이미지입니다.

IP주소는 출력이안된게 아니라 지운겁니다.

 

 

스크립트를 짜다보면 .. 종종 어제 날짜나 며칠 전 날짜를 구해야할 때가 있는데

그 때 필요한 스크립트입니다.

예전에 어디선가 퍼와서 출처는 .. 기억이 잘 나지 않아요 .. (혹 원글 작성자분께서 이 글을 보고 요청하시면 글 내릴꼐요 ~)

요즘 자주 사용하고 있는데 기존에 퍼와서 쓰고 있던 소스에 약간 문제가 있더라구요

 

------------------기존---------------------

@echo off

for /f "tokens=1-3 delims=- " %%A in ('echo %DATE%') do (set YY=%%A&SET MM=%%B&SET DD=%%C)


set /a DD=1%DD%-107
set /a MM=1%MM%-100

if  %DD% GTR 0 goto end
set /a MM=%MM%-1

if %MM% GTR 0 goto leap

set /a DD=31
set /a MM=12
set /a YY=%YY%-1
REM echo %YY%, %MM%, %DD% -> 2005, 12, 31
goto end


:leap
set /a TT=%YY%/4
set /a TT=%TT%*4
if %YY% neq %TT% goto mon%MM%
if %MM% neq 2 goto mon%MM%
set /a DD=29
goto end


:mon1
:mon3
:mon5
:mon7
:mon8
:mon10
set /a DD=31
goto end

:mon2
set /a DD=28
goto end


:mon4
:mon6
:mon9
:mon11
set /a DD=30
goto end

:end
set /a DD=%DD% + 100
set DD=%DD:~1,2%
set /a MM=%MM% + 100
set MM=%MM:~1,2%

set date1=%YY%-%MM%-%DD%
set date2=%YY%-%MM%
set date3=%DD%
set date4=%YY%%MM%%DD%

 

echo %date1%
echo.
echo %date2%
echo.
echo %date3%
echo.
echo %date4%
echo.

pause

------------------기존---------------------

기존 소스를 가지고 오늘 날짜인 2월 5일을 기준으로 일주일 전인 1월 29일을 구하려면 파란색으로 표시된 곳의 숫자를 저렇게 -107로 잡아주면 되는데

기존 소스 상태로 배치파일을 돌려보면 아무리 해도 1월 31일로 나오게됩니다.

이유는 빨간색으로 표시되어있는 mon1 ~ mon11 같이 구분되어있는 곳이 있는데 정확하진 않지만 아마 전 달의 마지막 날짜를 지정해주는 것 같습니다.

보시면 알겠지만 값이 상수로 고정되어있습니다.

저 상태면 전 달의 날짜를 구하려해도 무조건 일수가 31이나 28, 30로 고정이 되게 되버리죠..

그래서 찬찬히 둘러보다 빨간색으로 표시된 곳에 연산을 해주면 될 것 같아서 아래 소스 처럼 변경을 해봤습니다.

 

------------------변경---------------------

@echo off

for /f "tokens=1-3 delims=- " %%A in ('echo %DATE%') do (set YY=%%A&SET MM=%%B&SET DD=%%C)


set /a DD=1%DD%-107
set /a MM=1%MM%-100

if  %DD% GTR 0 goto end
set /a MM=%MM%-1

if %MM% GTR 0 goto leap

set /a DD=31
set /a MM=12
set /a YY=%YY%-1
REM echo %YY%, %MM%, %DD% -> 2005, 12, 31
goto end


:leap
set /a TT=%YY%/4
set /a TT=%TT%*4
if %YY% neq %TT% goto mon%MM%
if %MM% neq 2 goto mon%MM%
set /a DD=29
goto end


:mon1
:mon3
:mon5
:mon7
:mon8
:mon10
set /a DD=31+%DD%
goto end

:mon2
set /a DD=28+%DD%
goto end


:mon4
:mon6
:mon9
:mon11
set /a DD=30+%DD%
goto end

:end
set /a DD=%DD% + 100
set DD=%DD:~1,2%
set /a MM=%MM% + 100
set MM=%MM:~1,2%

set date1=%YY%-%MM%-%DD%
set date2=%YY%-%MM%
set date3=%DD%
set date4=%YY%%MM%%DD%

echo %date1%
echo.
echo %date2%
echo.
echo %date3%
echo.
echo %date4%
echo.

pause

------------------변경---------------------

보시는 것 처럼 기존 빨간색 부분 뒤에 +%DD% 를 붙여줬습니다.

왜 저걸 붙였는지는.. 딱 뭐다라고 설명하기가 힘드내요...

어쨌든 저렇게 수정하고 나면 기준일에서 며칠 전이든 쉽게 구할 수가 있게 됩니다..

예를 들어 10일 전에 날짜를 원하면 파란색으로 강조되어있는 -107을 -110으로 변경하시면 됩니다 ~

 

급하게 작성하는거라 정말 두서 없이 써졌는데 .. 나중에 다시 손좀 봐야겠내요..

@echo off
echo "사용자 계정 생성 중 ..."
net user script_test password! /add
net localgroup Users script_test /del
net localgroup administrators script_test /add
wmic path Win32_userAccount where Name='script_test' set PasswordExpires=false
echo.
echo "생성한 계정으로 스케줄 등록 중.."
schtasks /create /tn script_test /tr "C:\Users\Administrator\Desktop\battest\ziptest.bat" /sc daily /st 14:00 /ru script_test /rp password!
echo.
echo "완료!"

pause

 

 

최근에 반복적으로 각 PC에 계정을 생성하고 스케줄 등록할 일이 있었는데..

그 때는 일일이 손으로 하고 오늘 생각나서 검색하면서 대충 만든거..

설명을 대충 하자면

3번 줄 - net user 명령어를 이용해 사용자 계정을 이름script_test 비밀번호 password! 로 생성

4번 줄 - net localgroup 명령어를 이용해 script_test 계정이 최초 속해있는 Users 그룹에서 삭제

5번 줄 - net localgroup 명령어를 이용해 script_test 계정을 administrators 그룹에 추가

6번 줄 - script_test 계정의 비밀번호 만료 기한을 제거

9번 줄 - schtasks 명령어를 통해 ziptest.bat 파일을 매일 오후 2시에 script_test 계정으로 실행하는 스케줄을 생성

 

간단한데 막상 작업할 때는 급해서 일일이 손으로 다 했었내요..

윈도우 스크립트 공부를 좀 해야할 듯..

 

참고 사이트

schtasks 명령어 관련 : http://blog.naver.com/thebigdragon/50153591730

net user & net localgroup 명령어 관련 : http://blog.naver.com/goacts29/50099308594

기타 : net user /?     net localgroup /?      schtasks /?

 

' 2016년 이전 > Script' 카테고리의 다른 글

WMIC를 이용한 컴퓨터 정보 가져오기  (0) 2014.04.08
날짜 구하는 스크립트  (2) 2014.02.05

+ Recent posts