Is there any cross-platform way to check that my Python script is executed with admin rights? Unfortunately, os.getuid()
is UNIX-only and is not available under Windows.
问题:
回答1:
import ctypes, os
try:
is_admin = os.getuid() == 0
except AttributeError:
is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0
print is_admin
回答2:
Try doing whatever you need admin rights for, and check for failure.
This will only work for some things though, what are you trying to do?
回答3:
It's better if you check which platform your script is running (using sys.platform
) and do a test based on that, e.g. import some hasAdminRights function from another, platform-specific module.
On Windows you could check whether Windows\System32
is writable using os.access
, but remember to try to retrieve system's actual "Windows" folder path, probably using pywin32. Don't hardcode one.
回答4:
Administrator group membership (Domain/Local/Enterprise) is one thing..
tailoring your application to not use blanket privilege and setting fine grained rights is a better option especially if the app is being used iinteractively.
testing for particular named privileges (se_shutdown se_restore etc), file rights is abetter bet and easier to diagnose.
回答5:
Here's a utility function I created from the accepted answer:
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