在Windows下检查Python脚本中管理员权限的跨平台方法?

gri*_*yvp 18 python privileges admin-rights

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

gri*_*yvp 41

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

print is_admin
Run Code Online (Sandbox Code Playgroud)

  • 如果脚本是setuid可执行文件,那么`os.geteuid()`可能很有用(即,脚本被转换为独立的可执行文件,例如,使用PyInstaller或cx_Freeze并设置了setuid标志).`os.getuid()`在这种情况下不起作用.见[例子](https://gist.github.com/1361886). (2认同)
  • 这在Cygwin Python下不起作用.我正在Cygwin 64上运行Python 2.7.10.os.getuid()返回4875961,即使我正以"管理员"身份运行.并且ctypes模块没有'windll'. (2认同)

Bry*_*nta 6

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

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
Run Code Online (Sandbox Code Playgroud)