25

是否有任何跨平台方法来检查我的 Python 脚本是否以管理员权限执行?不幸的是,os.getuid()它仅适用于 UNIX,并且在 Windows 下不可用。

4

5 回答 5

57
import ctypes, os
try:
 is_admin = os.getuid() == 0
except AttributeError:
 is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0

print is_admin
于 2009-06-22T11:22:56.333 回答
7

这是我根据接受的答案创建的实用程序函数:

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
于 2017-04-02T20:02:50.710 回答
3

尝试做任何你需要管理员权限的事情,并检查是否失败。

但这仅适用于某些事情,您要做什么?

于 2009-06-22T10:25:50.707 回答
3

如果您检查您的脚本正在运行的平台(使用sys.platform)并在此基础上进行测试,例如从另一个特定于平台的模块导入一些 hasAdminRights 函数,那就更好了。

在 Windows 上,您可以Windows\System32使用 来检查是否可写os.access,但请记住尝试检索系统的实际“Windows”文件夹路径,可能使用 pywin32。不要硬编码一个。

于 2009-06-22T10:47:33.863 回答
1

管理员组成员身份(域/本地/企业)是一回事。

定制您的应用程序以不使用一揽子特权并设置细粒度权限是更好的选择,尤其是在以交互方式使用应用程序的情况下。

测试特定的命名权限(se_shutdown se_restore 等),文件权限更好,更容易诊断。

于 2009-06-24T14:07:57.157 回答