maneira de verificar os direitos de administrador em um script Python no Windows multi-plataforma?

StackOverflow https://stackoverflow.com/questions/1026431

  •  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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top