윈도우에서 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 의 상태가 좀 달라지기 때문에 설명한 것과 약간 다르게 동작하는 경우가 발생할 수도 있다.
'Language > Python' 카테고리의 다른 글
[wxPython] wxFrame::wxFrame 생성하기(생성자) (0) | 2017.01.28 |
---|---|
[wxPython] wxWindow의 상속 (0) | 2017.01.28 |
[wxPython] Simple wxPython(초간단 윈도우 띄우기) (0) | 2017.01.28 |
[wxPython] 미리 정의된 다이얼로그(Dialog) (0) | 2017.01.28 |
[Python] 파이썬 x86/x64 동시 설치 및 Pyinstaller 설치 (0) | 2017.01.20 |