在Windows下检查Python脚本中管理员权限的跨平台方法?
-
06-07-2019 - |
题
是否有任何跨平台的方法来检查我的Python脚本是否以管理员权限执行?不幸的是, os.getuid()
仅限UNIX,在Windows下不可用。
解决方案
import ctypes, os
try:
is_admin = os.getuid() == 0
except AttributeError:
is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0
print is_admin
其他提示
尝试执行您需要管理员权限的任何内容,并检查是否失败。
这只适用于某些事情,你想做什么?
最好是检查脚本运行的平台(使用 sys.platform
)并根据该平台进行测试,例如:从另一个特定于平台的模块导入一些hasAdminRights函数。
在Windows上,您可以使用 os.access
检查 Windows \ System32
是否可写,但请记住尝试检索系统的实际“Windows”。文件夹路径,可能使用pywin32。不要硬编码。
管理员组成员身份(域/本地/企业)是一回事..
将您的应用程序定制为不使用一揽子权限并设置细粒度权限是一个更好的选择,尤其是在应用程序被交叉使用时。
测试特定的命名权限(se_shutdown se_restore等),文件权限更好,更容易诊断。
这是我根据接受的答案创建的效用函数:
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
不隶属于 StackOverflow