Кросс-платформенный способ проверки прав администратора в скрипте Python под Windows?
-
06-07-2019 - |
Вопрос
Есть ли кроссплатформенный способ проверить, что мой скрипт Python выполняется с правами администратора? К сожалению, os.getuid ()
предназначен только для UNIX и недоступен в Windows.
Решение
import ctypes, os
try:
is_admin = os.getuid() == 0
except AttributeError:
is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0
print is_admin
Другие советы
Попробуйте сделать все, для чего вам нужны права администратора, и проверьте, нет ли ошибок.
Это будет работать только для некоторых вещей, что вы пытаетесь сделать?
Лучше, если вы проверите, на какой платформе работает ваш скрипт (используя sys.platform
), и выполните тест на его основе, например, импортировать некоторую функцию hasAdminRights из другого, специфичного для платформы модуля.
В Windows вы можете проверить, доступна ли запись для Windows \ System32
, с помощью os.access
, но не забудьте попытаться получить действительные " Windows " системы. путь к папке, вероятно, с использованием pywin32. Не указывайте один.
Членство в группе администраторов (Домен / Локальный / Предприятие) - это одно.
настройка вашего приложения, чтобы не использовать общие привилегии, и установка точных прав - это лучший вариант, особенно если приложение используется интерактивно.
проверка определенных именованных привилегий (se_shutdown se_restore и т. д.), права на файл лучше, и их легче диагностировать.
Вот полезная функция, которую я создал из принятого ответа:
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