시스템상에 큰일날뻔 한 이야기를 공유한다.

다음 스크립트는 문제가 되었던 3월의 업데이트를 사용자 PC에서 백그라운드로 제거,리부팅하지않음 처리하고, 5분 후 로그인 하지 않은 PC는 리부팅 메시지를 띄운 후 30초 후 리부팅 시키고, 수행대상 정보 수집하는 스크립트이다.


우선 완성된 스크립트부터

chcp 437

set vol=xxx

 wmic qfe | findstr 4089187 > NUL

:::현재 설치된 경우 0이고 미설치한 경우 1이다

if %ERRORLEVEL% == 0 (

wusa /uninstall /kb:4089187 /quiet /norestart

echo %date%,%time%,%COMPUTERNAME%>> %vol%\kb_uninsted_4089187.txt

goto NEXT

) else (

goto QUIT

)


:NEXT

chcp 949

timeout /t 300 /nobreak

qwinsta | findstr Active > NUL

if %ERRORLEVEL% == 1 (

msg * /time:0 "로그온되지 않아 리부팅 진행 합니다."

shutdown -r -t 30 > NUL

echo %date%,%time%,%COMPUTERNAME%>> %vol%\kb_restarted_4089187.txt

)


:QUIT


문제의 스크립트

 

wmic qfe | findstr 4089187 > NUL

:::현재 설치된 경우 0이고 미설치한 경우 1이다

if %ERRORLEVEL% == 0 (

wusa /uninstall /kb:4089187 /quiet /norestart

echo %date%,%time%,%COMPUTERNAME%>> %vol%\kb_uninsted_4089187.txt


qwinsta | findstr Active > NUL

if %ERRORLEVEL% == 1 (

chcp 949

msg * /time:0 "로그온되지 않아 리부팅 진행 합니다."

shutdown -r -t 30 > NUL

echo %date%,%time%,%COMPUTERNAME%>> %vol%\kb_restarted_4089187.txt

)

)




무엇이 문제인가

1. (윈도우 업데이트를 검색하는) if문 속에 아래에 또다른 if문(세션이 접속되어 있는지 체크하는 로직)을 넣었다.

-> 저 if문 안에 들어간 명령 한줄 한줄의 모든 %ERRORLEVEL%값은 1만 나왔다!



실험결과 : 직접 cmd창에서

chcp 437

qwinsta | findstr Active

echo %errorlevel% >>결과값 : 0



반면... bat에서

chcp 437

quinsta | findstr Active

결과값이 왜 1?


if문 아래에서 errorlevel이 바뀌지 않아서 그런듯!!

와 10년 감수했다!

이유는 모른다. 세션 연결 상태에서 findstr Active에 대한 %ERRORLEVEL%값이 정상적으로 0이 나와야하는데, batch스크립트 상에서 echo로 중간값을 출력해보면 무조건 1만 나오고 있었다. 또한, 1이나옴에도 불구하고, 리부팅 명령어가 한대의 서버에도 돌지 않았다는 점도 의아한 부분이다.

(이게 돌았다면 정말이지 대형 사고가 날 뻔했다)


-> 결과적으로 goto 문을 이용하여, if문을 빠져나온 후 명령을 수행하였다.

그 결과 %ERRORLEVEL%이 정상 동작하고, 또다른 if문에 들어가게 함으로서 문제가 해결되었다.

이건 진짜 batch를 안 쓸 수도 없는 환경에서 고육지책이고, 황당한 발견이다...


2. msg를 한글로 출력하기 위해 한글코드로 변환 chcp 949 명령어 역시, if문 안에 들어가면, 동작하지 않는다. 이유는 역시 모른다(...) 어쨌든 if문 들어가기 전에 밖으로 빼주었더니 정상적으로 한글 메시지가 출력되었다.


3. 문제의 windows 스케쥴러이다.

1) once로 걸면 죽어라고 트리거가 안올라온다. 3월 19일을 시작일로 해야 비로소 3월20일 새벽 스케쥴이 생성되는듯. 

2) 테스크 반복하는 것을 조합했더니, 아무리 replace를 해도 제대로 동작하지 않는 경우가 있었다.  이해하기 어렵다. 이는 나중에 기회 되면 기록을 해야겠다.


'OS > Windows' 카테고리의 다른 글

1. 현재 OS가 32bit 인지 64 bit 인지 구별하여 적용하는 batch 스크립트  (0) 2018.10.26
Windows Update 제품 구분  (0) 2018.10.16
WSUS 이슈 해결 6  (0) 2018.01.17
WSUS 이슈 해결 5  (0) 2018.01.15
WSUS 이슈사항4  (0) 2018.01.12