Кросс-платформенный способ проверить права администратора в скрипте 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