Cross-platform way to check admin rights in a Python script under Windows?

前端 未结 5 1611
傲寒
傲寒 2021-02-01 18:57

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 Win

相关标签:
5条回答
  • 2021-02-01 19:37

    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?

    0 讨论(0)
  • 2021-02-01 19:48

    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.

    0 讨论(0)
  • 2021-02-01 19:50

    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.

    0 讨论(0)
  • import ctypes, os
    try:
     is_admin = os.getuid() == 0
    except AttributeError:
     is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0
    
    print is_admin
    
    0 讨论(0)
  • 2021-02-01 20:02

    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
    
    0 讨论(0)
提交回复
热议问题