고객사에서 일부 사용자에게서 프로그램 오류가 발생한다며 아래와 같이 에러 캡처를 보내왔습니다.
프로그램에서 로그를 남기기 위해 로그 파일을 생성하는데 권한의 문제로 로그 파일을 생성하지 못해 프로그램 오류가 발생한 것 같습니다.
처음에는 Python 코드에서 관리자 권한을 요청하는 코드를 넣으려고 했는데, 실제로 Stackoverflow를 찾아보면 이런 내용이 나옵니다.
프로그램이 관리자 권한으로 실행되지 않았다면 관리자 권한으로 다시 프로그램을 실행시키는 코드입니다.
--uac-admin을 옵션에 추가하면 프로그램 실행 시 관리자 권한을 요청할 수 있습니다.
마지막으로 manifest 파일을 이용하여 시도해보았습니다.
spec 파일을 이용하여 pyinstaller로 빌드하면 <실행 파일 이름>.manifest 라는 파일이 생성됩니다.
파일에서 아랫부분을 찾아볼 수 있습니다.
그리고 이렇게 해서 프로그램을 설치하면 프로그램 아이콘에 오버레이 아이콘이 추가된 것을 확인할 수 있습니다.
그런데 문제는 manifest 파일이 빌드때마다 새로 생성된다는 것입니다.
빌드때마다 manifest 파일을 수정하는 것은 귀찮은 일입니다.
다행히 저희는 Jenkins을 이용하여 프로그램 빌드, 설치 파일을 생성하기 때문에 Jenkins의 powershell을 이용하여 manifest 파일을 자동으로 수정하도록 하였습니다.
프로그램에서 로그를 남기기 위해 로그 파일을 생성하는데 권한의 문제로 로그 파일을 생성하지 못해 프로그램 오류가 발생한 것 같습니다.
처음에는 Python 코드에서 관리자 권한을 요청하는 코드를 넣으려고 했는데, 실제로 Stackoverflow를 찾아보면 이런 내용이 나옵니다.
프로그램이 관리자 권한으로 실행되지 않았다면 관리자 권한으로 다시 프로그램을 실행시키는 코드입니다.
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)
하지만 개인적으로 이런 방식은 마음에 들지 않았고 조금 더 찾아보니 Pyinstaller로 exe 파일을 만들 때 옵션을 설정하여 관리자 권한을 요청하도록 할 수 있다고 합니다.--uac-admin을 옵션에 추가하면 프로그램 실행 시 관리자 권한을 요청할 수 있습니다.
pyinstaller.exe --uac-admin sample.py
하지만 안타깝게도 이 방식은 원하는 대로 동작하지 않았습니다.마지막으로 manifest 파일을 이용하여 시도해보았습니다.
spec 파일을 이용하여 pyinstaller로 빌드하면 <실행 파일 이름>.manifest 라는 파일이 생성됩니다.
파일에서 아랫부분을 찾아볼 수 있습니다.
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
requestedExecutionLevel이 asInvoker로 되어 있는데 관리자 권한을 요청하도록 아래와 같이 requireAdministrator로 바꿔줍니다.<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
이렇게 manifest 파일을 바꾼 뒤에 프로그램을 실행하니 권리자 권한을 요청을 확인하는 창이 뜨고 허용하면 프로그램이 관리자 권한으로 실행되었습니다.그리고 이렇게 해서 프로그램을 설치하면 프로그램 아이콘에 오버레이 아이콘이 추가된 것을 확인할 수 있습니다.
그런데 문제는 manifest 파일이 빌드때마다 새로 생성된다는 것입니다.
빌드때마다 manifest 파일을 수정하는 것은 귀찮은 일입니다.
다행히 저희는 Jenkins을 이용하여 프로그램 빌드, 설치 파일을 생성하기 때문에 Jenkins의 powershell을 이용하여 manifest 파일을 자동으로 수정하도록 하였습니다.
(get-content .\your.manifest) | % {$_ -replace 'asInvoker','requireAdministrator'} | Out-File .\your.manifest -Encoding ASCII
댓글
댓글 쓰기