Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Saya Boleh Menjalankan Skrip Python dengan Keistimewaan Tinggi pada Windows?

Bagaimanakah Saya Boleh Menjalankan Skrip Python dengan Keistimewaan Tinggi pada Windows?

DDD
DDDasal
2024-12-02 18:42:14988semak imbas

How Can I Run a Python Script with Elevated Privileges on Windows?

Jalankan Skrip dengan Keistimewaan Ditingkatkan pada Windows

Dalam Windows, sesetengah tugas memerlukan keistimewaan yang dinaikkan, yang merujuk kepada kebenaran melebihi tahap pengguna standard. Ini mungkin diperlukan untuk tindakan pentadbiran tertentu, seperti mengubah suai tetapan sistem atau mengakses fail yang dilindungi.

Untuk melaksanakan skrip dengan keistimewaan yang tinggi, anda boleh menggunakan modul seperti pyuac. Versi terkini pakej ini boleh didapati di PyPi dan GitHub. Untuk memasangnya menggunakan pip:

pip install pyuac
pip install pypiwin32

Setelah dipasang, berikut ialah contoh cara menggunakan pyuac:

import pyuac

def main():
    print("Do stuff here that requires elevated privileges.")
    # The window will disappear as soon as the program exits!
    input("Press enter to close the window. >")

if __name__ == "__main__":
    if not pyuac.isUserAdmin():
        print("Re-launching as admin!")
        pyuac.runAsAdmin()
    else:        
        main()  # Already an admin here.

Sebagai alternatif, jika anda ingin menggunakan penghias:

from pyuac import main_requires_admin

@main_requires_admin
def main():
    print("Do stuff here that requires elevated privileges.")
    # The window will disappear as soon as the program exits!
    input("Press enter to close the window. >")

if __name__ == "__main__":
    main()

Jika anda tidak mahu menggunakan pakej tambahan, anda juga boleh merujuk skrip yang disediakan oleh Preston Landers. Skrip ini membolehkan anda menyemak sama ada pengguna mempunyai hak pentadbiran dan, jika tidak, meminta ketinggian UAC. Berikut ialah contoh penggunaannya:

import admin

if not admin.isUserAdmin():
    admin.runAsAdmin()

Coretan kod skrip penuh:

#!/usr/bin/env python
# -*- coding: utf-8; mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-
# vim: fileencoding=utf-8 tabstop=4 expandtab shiftwidth=4

 
import sys, os, traceback, types
 
def isUserAdmin():
   
    if os.name == 'nt':
        import ctypes
        # WARNING: requires Windows XP SP2 or higher!
        try:
            return ctypes.windll.shell32.IsUserAnAdmin()
        except:
            traceback.print_exc()
            print "Admin check failed, assuming not an admin."
            return False
    elif os.name == 'posix':
        # Check for root on Posix
        return os.getuid() == 0
    else:
        raise RuntimeError, "Unsupported operating system for this module: %s" % (os.name,)
   
def runAsAdmin(cmdLine=None, wait=True):
 
    if os.name != 'nt':
        raise RuntimeError, "This function is only implemented on Windows."
   
    import win32api, win32con, win32event, win32process
    from win32com.shell.shell import ShellExecuteEx
    from win32com.shell import shellcon
   
    python_exe = sys.executable
 
    if cmdLine is None:
        cmdLine = [python_exe] + sys.argv
    elif type(cmdLine) not in (types.TupleType,types.ListType):
        raise ValueError, "cmdLine is not a sequence."
    cmd = '"%s"' % (cmdLine[0],)
    # XXX TODO: isn't there a function or something we can call to massage command line params?
    params = " ".join(['"%s"' % (x,) for x in cmdLine[1:]])
    cmdDir = ''
    showCmd = win32con.SW_SHOWNORMAL
    #showCmd = win32con.SW_HIDE
    lpVerb = 'runas'  # causes UAC elevation prompt.
   
    # print "Running", cmd, params
 
    # ShellExecute() doesn't seem to allow us to fetch the PID or handle
    # of the process, so we can't get anything useful from it. Therefore
    # the more complex ShellExecuteEx() must be used.
 
    # procHandle = win32api.ShellExecute(0, lpVerb, cmd, params, cmdDir, showCmd)
 
    procInfo = ShellExecuteEx(nShow=showCmd,
                              fMask=shellcon.SEE_MASK_NOCLOSEPROCESS,
                              lpVerb=lpVerb,
                              lpFile=cmd,
                              lpParameters=params)
 
    if wait:
        procHandle = procInfo['hProcess']    
        obj = win32event.WaitForSingleObject(procHandle, win32event.INFINITE)
        rc = win32process.GetExitCodeProcess(procHandle)
        #print "Process handle %s returned code %s" % (procHandle, rc)
    else:
        rc = None
 
    return rc
 
def test():
    rc = 0
    if not isUserAdmin():
        print "You're not an admin.", os.getpid(), "params: ", sys.argv
        #rc = runAsAdmin(["c:\Windows\notepad.exe"])
        rc = runAsAdmin()
    else:
        print "You are an admin!", os.getpid(), "params: ", sys.argv
        rc = 0
    x = raw_input('Press Enter to exit.')
    return rc
 
 
if __name__ == "__main__":
    sys.exit(test())

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menjalankan Skrip Python dengan Keistimewaan Tinggi pada Windows?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn