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

StackOverflow https://stackoverflow.com/questions/1026431

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top