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