Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah saya boleh menjalankan skrip Python dengan keistimewaan yang tinggi pada Windows?

Bagaimanakah saya boleh menjalankan skrip Python dengan keistimewaan yang tinggi pada Windows?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-03 12:08:39283semak imbas

How can I run Python scripts with elevated privileges on Windows?

Menjalankan Skrip dengan Keistimewaan Ditingkatkan pada Windows

Banyak tugas dalam pembangunan aplikasi memerlukan keistimewaan yang tinggi, terutamanya apabila berinteraksi dengan sumber sistem atau melaksanakan operasi pentadbiran. Artikel ini menangani masalah khusus menjalankan skrip dalam Python yang memerlukan akses pentadbiran.

Cabaran

Sampel kod yang disediakan cuba untuk memulakan skrip dengan keizinan tinggi. Walau bagaimanapun, skrip tidak pernah melepasi gesaan kebenaran. Isu ini nampaknya terletak pada salah tanggapan umum mengenai pelaksanaan skrip.

Penyelesaian

Kod yang disediakan adalah berdasarkan andaian bahawa ia boleh meningkatkan sendiri dengan memulakan semula dirinya dengan hak pentadbir . Walau bagaimanapun, pendekatan ini tidak boleh dilaksanakan kerana sifat operasi istimewa dalam Windows. Sebaliknya, kita mesti menggunakan mekanisme luaran untuk meminta ketinggian.

Satu penyelesaian yang sangat berkesan ialah skrip komprehensif yang dicipta oleh Preston Landers pada 2010. Skrip ini membolehkan pengguna menyemak dengan mudah sama ada pengguna semasa mempunyai keistimewaan pentadbiran dan, jika tidak , minta ketinggian UAC. Skrip menyediakan maklum balas visual dalam tetingkap berasingan, menunjukkan tindakan sistem.

Menggunakan Skrip Preston Landers

Skrip boleh disepadukan ke dalam aplikasi utama anda menggunakan coretan berikut:

import admin

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

Kod skrip penuh boleh didapati di bawah:

#!/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

# (C) COPYRIGHT © Preston Landers 2010
# Released under the same license as Python 2.6.5

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())

Sebagai alternatif, anda kini boleh pasang dan gunakan skrip ini sebagai pakej Python daripada PyPi. Ikuti langkah berikut:

  1. Pasang pakej menggunakan pip install pyuac dan pip install pypiwin32.
  2. Gunakan pakej seperti ini:
import pyuac

def main():
    print("Do stuff here that requires being run as an admin.")
    # 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.

Atau , gunakan penghias:

from pyuac import main_requires_admin

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

if __name__ == "__main__":
    main()

Atas ialah kandungan terperinci Bagaimanakah saya boleh menjalankan skrip Python dengan keistimewaan yang 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
Artikel sebelumnya:Model Industri PythonArtikel seterusnya:Model Industri Python