Python - 检查用户是否拥有管理员权限

4
我正在用Python 3.x写一个小型程序,作为自学项目。我的想法是让程序允许用户输入两个文本字段,然后将用户的输入插入到两个特定注册表键的值中。
是否有一种简单的方法来检查当前用户是否可以访问注册表?我希望它干净地告诉用户需要管理员权限,而不是因为尝试访问受限区域而崩溃。
我希望它在程序启动时就进行此检查,而不是在用户获得任何输入选项之前。需要什么代码来实现这一点?
编辑:如果不明显的话,这是针对Windows平台的。
4个回答

12

我需要一个简单的、Windows/Posix解决方案来测试用户是否具有对文件系统的root/admin权限,而无需安装第三方解决方案。我知道依赖环境变量存在漏洞,但它们适合我的目的。可能可以扩展这种方法以读取/写入注册表。

我在WinXP、WinVista和Wine上使用Python 2.6/2.7进行了测试。如果有人知道这在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)

这是第一个好答案,因为它实际上检查脚本是否具有管理员权限,而不是检查帐户。 - Bluscream
我正在使用 Windows 10 Pro 22H2。has_admin 脚本只能在管理员账户已经访问过 C:\Windows\Temp 并获得“永久”访问权限的情况下才能正常工作。您可以通过临时添加一个新的管理员账户并在运行脚本之前不访问 C:\Windows\Temp 来轻松测试。 - NZD

7

使用pywin32,可以尝试以下代码:

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

if shell.IsUserAnAdmin():
   ...

是的,看起来pywin32支持Python 3。


4

1

最直接的方法是尝试在开头更改键,可能更改为存根值 - 如果失败,则捕获错误并告知用户。


根据情况,这可能会覆盖现有键的值,这种情况下,您可能需要先读取它,保存该值,尝试更改它,并确保在成功后将其设置回来。这很好,直到有人在最后两个步骤之间按下ctrl-c或电源中断。这是一个简单的解决方案,但存在困难的边缘情况。 - Eloff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接