본문 바로가기

Language/Python

[Python] 관리자 권한 상승 요청 코드

윈도우에서 UAC 설정이 되어 있을 때, 권한 상승을 요청하기 위한 코드를 stackoverflow.com 사이트에서 발견...

까먹을 수 있으니 기록~~







[그림. 1] 권한 상승 요청 화면


사이트에서 발견한 코드는 아래와 같다.


import os
import sys
import win32com.shell.shell as shell
ASADMIN = 'asadmin'

if sys.argv[-1] != ASADMIN:
    script = os.path.abspath(sys.argv[0])
    params = ' '.join([script] + sys.argv[1:] + [ASADMIN])
    shell.ShellExecuteEx(lpVerb='runas', lpFile=sys.executable, lpParameters=params)
    sys.exit(0)


근데 저 코드를 윈도우 모드의 스크립트는 상관 없겠지만 콘솔모드의  스크립트에서 그대로 이용했을 때 관리자 권한으로 실행하지 않았을 경우, Traceback 에러 메시지를 콘솔에 뿌려버리니, 그 메시지가 좀 지저분해? 보여서 권한 상승 코드 자체를 함수화 시켜 try / except를 이용하여 오류 메시지를 안 뜨게 해버림.


어차피 권한 상승 안 시킬 때 나오는 오류는 보기 좋게 error message 를 별도 작성해서 깔끔하게 출력시키는 게 더 나을 듯 하다.


# -*- coding: utf-8 -*-


def uac_require(): # 관리자 권한 상승 요청 함수
asadmin = 'asadmin'
try:
if sys.argv[-1] != asadmin:
script = os.path.abspath(sys.argv[0])
params = ' '.join([script] + sys.argv[1:] + [asadmin])
shell.ShellExecuteEx(lpVerb='runas', lpFile=sys.executable, lpParameters=params)
            sys.exit()
return True

except:

return False


if __name__ == '__main__':
import win32com.shell.shell as shell
import os, sys

if uac_require(): # 관리자 권한 요청 함수 실행
print "continue" # 권한 상승 시 True 를 리턴받아서 다음 작업 수행
else: # 관리자 권한으로 실행안되면 False 받아 else 문 수행
print "error message" # else문에 별도의 메시지를 넣거나 종료 등을 수행


이런 유형으로 하니깐 개인적으로 좀 더 그냥 보기 좋아진 듯?? 흠!~~



-- [글 수정] --


실수로 위의 원본코드를 수정한 코드에 반영할 때 코드 하나를 적지 못했었다.

바로 sys.exit() 명령어인데.. 저것을 적는 이유를 간략히 설명하자면 저 코드는 A라는 프로세스가 ShellexecuteEx 메소드를 이용하여 자기 자신을 admin 권한으로 실행시키려는 행위이다.

즉, 자기 자신을 자식 프로세스로서 하나 더 띄우는 건데, 그 자식 프로세스는 if sys.argv[-1] != asadmin:이 부분의 코드를 타지 않고 흐르게 된다.

(자식은 asadmin 권한 요청으로 호출되었기 때문에 -1번째 argument에는 asadmin 이 들어가 있기 때문이다.)


다시 앞서 돌아가 sys.exit()가 필요했던 이유는 부모 프로세스 A는 자식 프로세스A를 호출하고 종료가 돼야 하기 때문이다. 근데 막상 실행하면 자식 프로세스가 종료되기 전까지 A프로세는 sys.exit()이후로 아무 작업도 안 하고 그냥 대기를 타더군.

(적은 양의 시스템 메모리 공간을 차지하게 됨.)


참고로 위의 설명은 exe로 만들어진 파일을 실행할 때에 대한 argument를 고려한 코드이다. 만약 pycharm 에서 저 코드를 실행해 버리면 argument 의 상태가 좀 달라지기 때문에 설명한 것과 약간 다르게 동작하는 경우가 발생할 수도 있다.