Кросс-платформенный способ проверить права администратора в скрипте Python под Windows?
есть ли кросс-платформенный способ проверить, что мой скрипт Python выполняется с правами администратора? К сожалению, os.getuid()
только для UNIX и недоступен в Windows.
5 ответов
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. Не Закодируйте его.
членство в группе администраторов (домен/локальный/корпоративный) - это одно..
адаптация приложения не использовать общие привилегии и установка мелкозернистых прав является лучшим вариантом, особенно если приложение используется iinteractively.
тестирование для конкретных именованных привилегий (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