Request UAC elevation from within a Python script?

前端 未结 11 645

I want my Python script to copy files on Vista. When I run it from a normal cmd.exe window, no errors are generated, yet the files are NOT copied. If I run

11条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-11-22 05:46

    The following example builds on MARTIN DE LA FUENTE SAAVEDRA's excellent work and accepted answer. In particular, two enumerations are introduced. The first allows for easy specification of how an elevated program is to be opened, and the second helps when errors need to be easily identified. Please note that if you want all command line arguments passed to the new process, sys.argv[0] should probably be replaced with a function call: subprocess.list2cmdline(sys.argv).

    #! /usr/bin/env python3
    import ctypes
    import enum
    import subprocess
    import sys
    
    # Reference:
    # msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx
    
    
    # noinspection SpellCheckingInspection
    class SW(enum.IntEnum):
        HIDE = 0
        MAXIMIZE = 3
        MINIMIZE = 6
        RESTORE = 9
        SHOW = 5
        SHOWDEFAULT = 10
        SHOWMAXIMIZED = 3
        SHOWMINIMIZED = 2
        SHOWMINNOACTIVE = 7
        SHOWNA = 8
        SHOWNOACTIVATE = 4
        SHOWNORMAL = 1
    
    
    class ERROR(enum.IntEnum):
        ZERO = 0
        FILE_NOT_FOUND = 2
        PATH_NOT_FOUND = 3
        BAD_FORMAT = 11
        ACCESS_DENIED = 5
        ASSOC_INCOMPLETE = 27
        DDE_BUSY = 30
        DDE_FAIL = 29
        DDE_TIMEOUT = 28
        DLL_NOT_FOUND = 32
        NO_ASSOC = 31
        OOM = 8
        SHARE = 26
    
    
    def bootstrap():
        if ctypes.windll.shell32.IsUserAnAdmin():
            main()
        else:
           # noinspection SpellCheckingInspection
            hinstance = ctypes.windll.shell32.ShellExecuteW(
                None,
                'runas',
                sys.executable,
                subprocess.list2cmdline(sys.argv),
                None,
                SW.SHOWNORMAL
            )
            if hinstance <= 32:
                raise RuntimeError(ERROR(hinstance))
    
    
    def main():
        # Your Code Here
        print(input('Echo: '))
    
    
    if __name__ == '__main__':
        bootstrap()
    

提交回复
热议问题