2017-02-10 3 views
0

"C : \\"(테스트 용도로만 사용)에 압축 파일을 압축 해제하려고합니다. 따라서 관리자 권한이 필요하므로 관리자 권한을 얻기 위해 현재 사용자 권한을 높이려고합니다.Python을 통해 사용자 높이기

if __name__ == "__main__": 
    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) 
     main() 

UAC에서 호출 메시지는 정상적으로오고하지만 난 여전히 무엇입니까 우편을 추출 할 때 "IO 오류 : [errno를 13] 사용 권한이 거부되었습니다."

내가 뭘 잘못하고 있니?

답변

2

새 권한으로 동일한 스크립트를 다시 실행하는 것이 목표 인 것처럼 보입니다.

당신이하고있는 방식은 이제 새로운 프로세스에서 스크립트를 다시 실행합니다. 그러면 새 프로세스에서 "asadmin"플래그가 있는지 확인한 다음 거기에서 수행 할 작업이 없기 때문에 즉시 종료됩니다. 그런 다음 원래 프로세스 (권한 상승없이)가 main을 실행합니다.

if __name__ == "__main__": 
    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) 
    else: 
     main() 

또한, 당신은 권한을 확인 할 수있는 더 좋은 방법을 찾을 :이 asadmin가 설정되어있는 경우에만 실행됩니다 있도록

당신은 아마 else 블록에 main에 전화를 넣어합니다. 이 스크립트를 admin으로 실행하면 "asadmin"플래그를 설정하기 위해 여전히을 다시 실행해야합니다. 그리고 일반 사용자로 실행하고 "asadmin"을 수동으로 설정하면 스크립트가 작동하지 않습니다. 어딘가에 API가있을 것입니다.

+0

흠, 내가했던 것처럼 코드를 바꿨지 만 지금 종료 코드가 0 인 UAC 직후에 프로그램이 종료됩니까? –

+0

글쎄, shell.ShellExecuteEx 차단 호출인지 모르겠다. 비 블로킹이면 스크립트의 원래 실행이 즉시 종료되고 동일한 스크립트를 사용하는 새 프로세스가 메인에있는 작업을 모두 수행하면서 계속 실행됩니다. 이 질문도 참조하십시오. http://stackoverflow.com/questions/130763 – zstewart

관련 문제