maneira de verificar os direitos de administrador em um script Python no Windows multi-plataforma?
-
06-07-2019 - |
Pergunta
Existe alguma maneira de plataforma cruzada para verificar se o meu Python script é executado com direitos de administrador? Infelizmente, os.getuid()
é UNIX-somente e não está disponível no Windows.
Solução
import ctypes, os
try:
is_admin = os.getuid() == 0
except AttributeError:
is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0
print is_admin
Outras dicas
Tente fazer o que você precisa de direitos de administrador para, e verificar se há falhas.
Este só irá funcionar para algumas coisas embora, o que você está tentando fazer?
É melhor se você verificar qual plataforma seu script está em execução (usando sys.platform
) e fazer um teste com base em que, por exemplo, importar alguns hasAdminRights funcionar de outro, o módulo específico da plataforma.
No Windows, você pode verificar se Windows\System32
é gravável utilizando os.access
, mas lembre-se de tentar recuperar real "Windows" caminho da pasta do sistema, provavelmente usando pywin32. Execute um não hardcode.
participação no grupo Administrator (Domain / Local / Empresa) é uma coisa ..
alfaiataria seu aplicativo para não usar privilégio cobertor e configuração de granulação fina direitos é uma opção melhor, especialmente se o aplicativo está sendo usado iinteractively.
testar para determinados privilégios nomeados (se_shutdown se_restore etc), direitos de arquivo é cúmplice aposta e mais fácil de diagnosticar.
Aqui está uma função de utilidade I criado a partir da resposta aceita:
import os
import ctypes
class AdminStateUnknownError(Exception):
"""Cannot determine whether the user is an admin."""
pass
def is_user_admin():
# type: () -> bool
"""Return True if user has admin privileges.
Raises:
AdminStateUnknownError if user privileges cannot be determined.
"""
try:
return os.getuid() == 0
except AttributeError:
pass
try:
return ctypes.windll.shell32.IsUserAnAdmin() == 1
except AttributeError:
raise AdminStateUnknownError