Python - проверка наличия у пользователя прав администратора - PullRequest
3 голосов
/ 01 июня 2010

Я пишу небольшую программу как самообучающийся проект на Python 3.x. Моя идея состоит в том, чтобы программа позволила пользователю ввести два поля ввода текста, а затем подключить ввод пользователя к значению двух конкретных ключей реестра.

Есть ли простой способ проверить, может ли текущий пользователь получить доступ к реестру? Я бы предпочел, чтобы он просто сказал пользователю, что ему / ей нужны привилегии администратора, чем программа, которая может сойти с ума и потерпеть крах, потому что она пытается получить доступ к ограниченной области.

Я бы хотел сделать эту проверку, как только программа запустится, прежде чем пользователю будут предоставлены какие-либо параметры ввода. Какой код для этого нужен?

Редактировать: если это не очевидно, это для платформ Windows.

Ответы [ 4 ]

7 голосов
/ 20 мая 2012

Мне нужно было простое решение для Windows / Posix, чтобы проверить, есть ли у пользователя права root / admin для файловой системы без установки стороннего решения. Я понимаю, что существуют уязвимости при использовании переменных среды, но они подходят для моей цели. Можно было бы расширить этот подход для чтения / записи реестра.

Я тестировал это с Python 2.6 / 2.7 на WinXP, WinVista и Wine. Если кто-нибудь знает, что это не будет работать на Pyton 3.x и / или Win7, пожалуйста, сообщите. Спасибо.

def has_admin():
    import os
    if os.name == 'nt':
        try:
            # only windows users with admin privileges can read the C:\windows\temp
            temp = os.listdir(os.sep.join([os.environ.get('SystemRoot','C:\\windows'),'temp']))
        except:
            return (os.environ['USERNAME'],False)
        else:
            return (os.environ['USERNAME'],True)
    else:
        if 'SUDO_USER' in os.environ and os.geteuid() == 0:
            return (os.environ['SUDO_USER'],True)
        else:
            return (os.environ['USERNAME'],False)
6 голосов
/ 01 июня 2010

С pywin32 должно работать что-то вроде следующего ...:

import pythoncom
import pywintypes
import win32api
from win32com.shell import shell

if shell.IsUserAnAdmin():
   ...

И да, похоже, Pywin32 действительно поддерживает Python 3.

4 голосов
/ 01 июня 2010

Вот небольшая статья о , как определить, требует ли приложение повышенных привилегий .

Вы можете использовать pywin32 или ctypes для вызова CreateProcess ().

Я предлагаю ctypes, так как теперь он входит в стандартную для python, и здесь есть хороший пример использования CreateProcess с ctypes .

1 голос
/ 01 июня 2010

Самый простой способ - попытаться изменить ключ в начале, возможно, на значение заглушки - если это не удастся, поймайте ошибку и сообщите пользователю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...