2017-02-10 14 views
0

Я хочу извлечь zip-архив на «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() 

Сообщение ссылающееся с ОАК пришедшего, как должно, но когда я хочу, чтобы извлечь молнию я все еще получаю «IOError: [Errno 13] Доступ запрещен».

Что я здесь делаю неправильно?

ответ

2

Похоже, ваша цель состоит в том, чтобы повторно выполнить тот же скрипт с новыми разрешениями.

То, как вы это делаете, теперь выполняет сценарий снова в новом процессе, который затем проверяет, что он имеет флаг «asadmin» и сразу же выходит, потому что там нечего делать. Тогда исходный процесс (без повышенных разрешений) выполняется main.

Вы, вероятно, хотите, чтобы поставить вызов на main в else блоке, так он запускается на выполнение только тогда, когда asadmin установлено:

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. И если вы работаете как обычный пользователь и устанавливаете «asadmin» вручную, скрипт не работает. Вероятно, для этого есть API.

+0

Хм я изменил код, как вы, но теперь моя программа выходит сразу после UAC с кодом выхода 0? –

+0

Ну, я не знаю, является ли shell.ShellExecuteEx блокирующим вызовом. Если он не блокируется, ваш исходный запуск скрипта будет немедленно завершен, и новый процесс с тем же скриптом будет продолжаться отдельно, делая все, что в принципе. См. Также, этот вопрос: http://stackoverflow.com/questions/130763 – zstewart