즉석 관리자 권한을 위한 윈도우 BATCH 스크립트

간단한 팁을 주도록 하겠다.
아마 가장 짧은 관리자 권한 상승 후 실행 스크립트 되겠다.

배치 파일을 작성하다 보면 관리자 권한 상승을 요할 때도 있다.
그러다가 관리자 권한 여부를 확인 후 아니면 관리자 권한 달라고 메시지 날리고 끌 수도 있긴 하다.
하지만 사용자에겐 불편할 수밖에 없다.
그래서 Stack overflow에서도 배치 파일로 관리자 권한 상승에 대한 커뮤니티 연구가 진행되었고.
우린 윈도우 7 까지는 관리자 권한 상승을 아예 꺼서 못느꼈을 수도 있겠지만,
윈도우 8부터는 관리자 권한을 끄면 여간 불편한 일이 생기는 게 한두개가 아니고 레지 건드리는 방법 외엔 없어서
국내 액티브엑스도 처음엔 관리자 권한 끄라고 요청했다가 보안 전문가들에게 털리고 이제 관리자 권한 상승을 요구한다.

어쨌든, 이 마법의 구분을 공개하도록 하겠다.

@ECHO OFF

NET SESSION 2>nul >nul
IF %ERRORLEVEL% NEQ 0 (
IF "%1" == "ELEVATED" GOTO NOTELEVATED
GOTO ELEVATE
)
GOTO ADMINTASKS

:ELEVATE
pushd %~dp0
MSHTA "javascript: var shell = new ActiveXObject('shell.application'); shell.ShellExecute('%~nx0', 'ELEVATED', '', 'runas', 1);close();"
EXIT

:ADMINTASKS
REM 여기에 관리자 권한 상승 후 배치 내용 나열
PAUSE
EXIT

:NOTELEVATED
echo No admin rights
PAUSE
EXIT

자, 처음에 NET SESSION 이라는 꽤 생소한 명령어가 있다. 보통 NET 명령어는 서비스 시작/종료하거나 방화벽 설정 시 자주 사용한다.
SESSION 명령어는 당신 컴퓨터로 공유 폴더던 뭐던 접속할 때 컴퓨터 목록을 띄우는 명령어인데, 목록이 있던 없던 종료 코드는 0이고, 대체적으로 관리자 권한이 없는 경우 외에 오류 코드가 없기 때문에 사용한 것이다.
게다가 NET 명령어는 HELP 수식어가 없으면 무조건 관리자 권한이 필요한 특징을 가지고 있다. 그래서 가장 간단하게 관리자 권한 여부를 확인할 수 있는 마법의 명령어 되시겠다.
뒤에 2>nul >nul 은 아무것도 출력하지 못하게 하는 연산 명령어다. 보통 파일명 붙이면 명령어 출력 결과를 파일로 저장하는데, nul은 일종의 블랙홀 되시겠다.
2는 오류 출력을 가리키는데, 오류 출력도 가리고, 일반 출력도 가리게 하는 연산 명령어라 보면 된다.

이리하여 if 문으로 명령어 결과 코드가 0이면 관리자 권한으로 넘어가면 되고, 그 외 숫자일 경우 관리자 권한을 요청하여 분기로 나눈다.
이제 중요한 부분인데, 보통 BAT 자체로는 관리자 권한 상승이 불가능하기 때문에 임시 폴더 등에 Shell.Application 객체가 담긴 vbs 파일을 만들어 실행했었다.
하지만 이번에는 시스템급 웹 페이지를 띄우는 .hta 파일을 실행하는 mshta를 사용했다. javascript: 프로토콜도 먹힌다. 애초에 엔진이 IE니까.
그리고 내용이야 vbs 생성 내용과 크게 다를 거 없다. 단지 특징이 있다면 배치 파일 자신을 다시 실행하는 거다. 이것도 기존과 크게 다를 게 없다.
이리하여 관리자 권한을 얻으면 다시 BAT 파일을 실행하게 되고, 못얻으면 그냥 종료된다.
관리자 권한을 얻게 되면, ADMINTASKS 부분으로 이동하여 명령어를 실행하게 된다. 그 부분 아래 원하는 명령어 내용을 입력하면 된다.
말이 거창하지만 짧고 간결하며 윈도우 10 최신 환경에서도 실행 잘되는 배치 파일 되시겠다. 유용하게 쓰도록.

출처: Stack overflow – How can I auto-elevate my batch file, so that it requests from UAC administrator rights if required?

composite / 2018년 4월 27일 / Piss Development
태그:, , ,

답글 남기기

Your email address will not be published / Required fields are marked *