Права администратора для скрипта
Вопрос
как я могу проверить права администратора для моего скрипта во время запуска?
Решение
В Unix вы можете проверить, являетесь ли вы root, используя операционная система.getuid функция:
os.getuid() == 0 and "root" or "not root"
Другие советы
Понятие "привилегии администратора" в наши дни мелкозернистого контроля привилегий становится трудно поддающимся определению.Если вы работаете в unix с "традиционной" моделью управления доступом, получение эффективного идентификатора пользователя (доступного в модуле os) и проверка его на соответствие root (0) может быть тем, что вы ищете.Если вы знаете, что для доступа к файлу в системе требуются привилегии, которые вы хотите предоставить своему сценарию, вы можете использовать os.access(), чтобы проверить, достаточно ли у вас привилегий.
К сожалению, не существует простого или переносимого метода для предоставления.Вам нужно выяснить или определить используемую модель безопасности, какие системные API доступны для запроса и установки привилегий и попытаться найти (или, возможно, реализовать самостоятельно) соответствующие модули python, которые можно использовать для доступа к API.
Классический вопрос: зачем вам это нужно выяснить?Что, если ваш скрипт пытается делать то, что ему нужно, и "просто" улавливает и должным образом обрабатывает сбои?
Если вы просто пытаетесь узнать, есть ли у вас доступ к определенному файлу, для которого требуются права администратора, хорошим способом проверки было бы:
import os
print os.access("/path/to/file", os.W_OK)
#replace W_OK with R_OK to test for read permissions
С другой стороны, если вам действительно нужно знать, является ли пользователь учетной записью администратора, вы также можете использовать этот код в Windows 2000 и выше:
import ctypes
print ctypes.windll.shell32.IsUserAnAdmin()
Следовательно, лучшим кроссплатформенным способом узнать, является ли пользователь администратором, является:
import ctypes, os
try:
is_admin = os.getuid() == 0
except:
is_admin = ctypes.windll.shell32.IsUserAnAdmin()
print is_admin
Конечно, этот метод определит, только если пользователь находится корень в Unix или является членом группы администраторов в Windows.Однако, на мой взгляд, этого достаточно для большинства целей.
Также обратите внимание, что это приведет к сбою в версиях Windows ниже 2000, а также в Windows ME, поскольку это версии Windows на базе DOS и не имеют никакого понятия о разрешениях.