Подтвердить что ты не робот

Кросс-платформенный способ проверки прав администратора в Python script под Windows?

Есть ли кросс-платформенный способ проверить, что мой Python script выполняется с правами администратора? К сожалению, os.getuid() является UNIX-only и недоступен под Windows.

4b9b3361

Ответ 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