Quero que meu script Python copie arquivos no Vista. Ao executá-lo em uma cmd.exe
janela normal , nenhum erro é gerado, mas os arquivos NÃO são copiados. Se eu executar cmd.exe
"como administrador" e depois executar meu script, ele funcionará bem.
Isso faz sentido, já que o Controle de Conta de Usuário (UAC) normalmente impede muitas ações do sistema de arquivos.
Existe uma maneira de, de dentro de um script Python, invocar uma solicitação de elevação UAC (aquelas caixas de diálogo que dizem algo como "tal e tal aplicativo precisa de acesso de administrador, está certo?")
Se isso não for possível, há uma maneira de meu script pelo menos detectar que não está elevado para que possa falhar normalmente?
python
windows
windows-vista
uac
jwfearn
fonte
fonte
Respostas:
A partir de 2017, um método fácil de conseguir isso é o seguinte:
Se estiver usando Python 2.x, você deve substituir a última linha por:
Observe também que se você converteu você script python em um arquivo executável (usando ferramentas como
py2exe
,cx_freeze
,pyinstaller
), então você deve usarsys.argv[1:]
em vez desys.argv
no quarto parâmetro.Algumas das vantagens aqui são:
ctypes
esys
da biblioteca padrão.A documentação da chamada ShellExecute subjacente está aqui .
fonte
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, "", None, 1)
sys.executable
resolve apenas o interpretador python (por exemploC:\Python27\Python.exe
). A solução é adicionar o script em execução como um argumento (substituindo""
).ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
Observe também que, para que isso funcione no python 2.x, todos os argumentos de string precisam ser Unicode (ou sejau"runas"
,unicode(sys.executable)
eunicode(__file__)
)ShellExecuteW
eShellExecuteA
são chamadas para aShellExecute
função na API do Windows. O primeiro obriga as strings a estarem no formato unicode e o segundo é usado no formato ANSIDemorei um pouco para fazer a resposta de dguaraglia funcionar, então, no interesse de economizar o tempo de outras pessoas, aqui está o que fiz para implementar essa ideia:
fonte
subprocess.list2cmdline
para fazê-lo corretamente.Parece que não há como elevar os privilégios do aplicativo por um tempo para que você execute uma tarefa específica. O Windows precisa saber no início do programa se o aplicativo requer certos privilégios e pedirá ao usuário para confirmar quando o aplicativo executa qualquer tarefa que precise desses privilégios. Existem duas maneiras de fazer isso:
Estes dois artigos explicam com muito mais detalhes como isso funciona.
O que eu faria, se você não quiser escrever um invólucro ctypes desagradável para a API CreateElevatedProcess, é usar o truque ShellExecuteEx explicado no artigo do Projeto de código (Pywin32 vem com um invólucro para ShellExecute). Quão? Algo assim:
Quando o seu programa é iniciado, ele verifica se tem privilégios de Administrador, se não ele se executa usando o truque ShellExecute e sai imediatamente, se tiver, executa a tarefa em questão.
Conforme você descreve seu programa como um "script", suponho que seja o suficiente para suas necessidades.
Felicidades.
fonte
runas
traz um novo prompt. E startfile não aceita argumentos de linha de comando para$EXECUTABLE.
.chm
arquivo.Basta adicionar esta resposta caso outros sejam direcionados aqui pela Pesquisa Google como eu. Usei o
elevate
módulo em meu script Python e o script executado com privilégios de administrador no Windows 10.https://pypi.org/project/elevate/
fonte
elevate
módulo e estou recebendo o erro "O arquivo não pode ser acessado pelo sistema", alguma idéia de por que isso aconteceria?O exemplo a seguir baseia-se no excelente trabalho e na resposta aceita de MARTIN DE LA FUENTE SAAVEDRA . Em particular, duas enumerações são introduzidas. O primeiro permite a fácil especificação de como um programa elevado deve ser aberto e o segundo ajuda quando os erros precisam ser facilmente identificados. Por favor, note que se você quiser que todos os argumentos de linha de comando passados para o novo processo,
sys.argv[0]
provavelmente deve ser substituída por uma chamada de função:subprocess.list2cmdline(sys.argv)
.fonte
Reconhecendo que essa pergunta foi feita anos atrás, acho que uma solução mais elegante é oferecida no github por frmdstryr usando seu módulo pywinutils:
Excerto:
Isso utiliza a interface COM e indica automaticamente que os privilégios de administrador são necessários com o prompt de diálogo familiar que você veria se estivesse copiando para um diretório onde os privilégios de administrador são necessários e também fornece a caixa de diálogo de progresso de arquivo típica durante a operação de cópia.
fonte
Isso pode não responder completamente à sua pergunta, mas você também pode tentar usar o Elevate Command Powertoy para executar o script com privilégios UAC elevados.
http://technet.microsoft.com/en-us/magazine/2008.06.elevation.aspx
Acho que se você usá-lo, parecerá 'elevate python yourscript.py'
fonte
Você pode criar um atalho em algum lugar e, como destino, usar: python yourscript.py e, em seguida, em propriedades e seleção avançada, execute como administrador.
Quando o usuário executa o atalho, ele pede para elevar o aplicativo.
fonte
Se o seu script sempre requer privilégios de administrador:
fonte
your_script.py
como um usuário Administrador. Certifique-se de entender o comentário de @Kugel .Uma variação do trabalho de Jorenko acima permite que o processo elevado use o mesmo console (mas veja meu comentário abaixo):
fonte
Esta é principalmente uma atualização para a resposta de Jorenko, que permite usar parâmetros com espaços no Windows, mas também deve funcionar bastante bem no Linux :) Além disso, funcionará com cx_freeze ou py2exe já que não usamos,
__file__
massys.argv[0]
como executáveisfonte