Python程序自動(dòng)以管理員權(quán)限運(yùn)行的實(shí)現(xiàn)方法
前言
由于Windows的安全機(jī)制,Python寫(xiě)的腳本缺少了管理員權(quán)限,運(yùn)行就會(huì)受到一些限制。
文章介紹Python 腳本自動(dòng)以管理員權(quán)限運(yùn)行的方法,
也就是如果腳本不是以管理員運(yùn)行,就自動(dòng)提升到管理員權(quán)限。
核心API函數(shù)
將python提升到管理員權(quán)限運(yùn)行需要調(diào)用ShellExecute這個(gè)API函數(shù)。
ShellExecute函數(shù)的用法如下(這里僅作了解 ):
ShellExecute(hWnd,Operation,FileName,Parameters,Directory,ShowCmd)
hWnd: 整數(shù) (指定父窗口句柄,如果沒(méi)有可用None代替)
Operation: 字符串 (指定動(dòng)作, 譬如: open、runas、print、edit、explore、find)
FileName: 字符串 (指定要打開(kāi)的文件或程序)
Parameters: 字符串 (給要打開(kāi)的程序指定參數(shù))
Directory: 字符串 (缺省目錄)
ShowCmd: 整數(shù) (程序啟動(dòng)后的窗口顯示方式,
正常為1、最小化為2、最大化為3)
代碼實(shí)現(xiàn)(1)
使用Python自帶的ctypes模塊,調(diào)用API函數(shù)的代碼:
import ctypes, sys
def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
if is_admin():
# 主程序?qū)懺谶@里
else:
# 以管理員權(quán)限重新運(yùn)行程序
ctypes.windll.shell32.ShellExecuteW(None,"runas", sys.executable, __file__, None, 1)
如果是Python 2,把最后一行改成這樣:
ctypes.windll.shell32.ShellExecuteW(None, u"runas", unicode(sys.executable), unicode(__file__), None, 1)
如果使用pyinstaller等庫(kù)打包python程序,則應(yīng)將ShellExecuteW的第四個(gè)參數(shù)替換為""。
另外,在ShellExecuteW的第4個(gè)參數(shù)中可加入其他的命令行參數(shù),
在第6個(gè)參數(shù)中可指定窗口顯示方式,如最小化(為2)、最大化(為3)等。
本方法優(yōu)點(diǎn):
- 不需要外部庫(kù),僅使用自帶的
ctypes模塊。 - 適用于Python 2和Python 3。
本方法缺點(diǎn):
在命令行窗口(cmd)中運(yùn)行python時(shí),會(huì)另外打開(kāi)一個(gè)命令行窗口,造成輸出的消息一閃而過(guò)。
(不過(guò),據(jù)了解這似乎是Windows自身的安全機(jī)制造成的,而不是程序的bug,可能是用于防止漏洞)
代碼實(shí)現(xiàn)(2)
相比于Python自帶的ctypes庫(kù),win32api庫(kù)更加廣為人知、使用方便。
使用pip的安裝方法:pip install pywin32使用win32api模塊的代碼:
import sys, os, win32api
def is_admin():
# 由于win32api中沒(méi)有IsUserAnAdmin函數(shù),所以用了這種方法
try:
# 在c:\windows目錄下新建一個(gè)文件test01.txt
testfile=os.path.join(os.getenv("windir"),"test01.txt")
open(testfile,"w").close()
except OSError: # 不成功
return False
else: # 成功
os.remove(testfile) # 刪除文件
return True
print(is_admin())
if is_admin():
# 主程序?qū)懺谶@里
else:
# 以管理員權(quán)限重新運(yùn)行程序
win32api.ShellExecute(None,"runas", sys.executable, __file__, None, 1)
如果是Python 2,將except OSError這一行改為except IOError。
本方法優(yōu)點(diǎn):
- 適用于Python 2和Python 3。
總結(jié)
到此這篇關(guān)于Python程序自動(dòng)以管理員權(quán)限運(yùn)行實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python自動(dòng)以管理員權(quán)限運(yùn)行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用FastCGI部署Python的Django應(yīng)用的教程
這篇文章主要介紹了使用FastCGI部署Python的Django應(yīng)用的教程,FastCGI也是被最廣泛的應(yīng)用于Python框架和服務(wù)器連接的模塊,需要的朋友可以參考下2015-07-07
PyCharm插件開(kāi)發(fā)實(shí)踐之PyGetterAndSetter詳解
這篇文章主要介紹了PyCharm插件開(kāi)發(fā)實(shí)踐-PyGetterAndSetter,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10
解決pyecharts運(yùn)行后產(chǎn)生的html文件用瀏覽器打開(kāi)空白
這篇文章主要介紹了解決pyecharts運(yùn)行后產(chǎn)生的html文件用瀏覽器打開(kāi)空白,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Pandas之使用drop_duplicates:去除重復(fù)項(xiàng)
這篇文章主要介紹了Pandas之使用drop_duplicates:去除重復(fù)項(xiàng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
python寫(xiě)入數(shù)據(jù)到csv或xlsx文件的3種方法
這篇文章主要為大家詳細(xì)介紹了python寫(xiě)入數(shù)據(jù)到csv或xlsx文件的3種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
Python實(shí)現(xiàn)提取給定網(wǎng)頁(yè)內(nèi)的所有鏈接
這篇文章主要和大家分享一個(gè)實(shí)用的Python腳本,可以實(shí)現(xiàn)從給定的網(wǎng)頁(yè)中檢索所有鏈接,并將其保存為txt文件,需要的小伙伴可以收藏一下2023-05-05
Python基于Flask構(gòu)建一個(gè)URL書(shū)簽管理工具
在信息爆炸的時(shí)代,我們每天都會(huì)接觸到大量有價(jià)值的網(wǎng)頁(yè)和在線資源,基于Web的URL書(shū)簽管理工具應(yīng)運(yùn)而生,它解決了傳統(tǒng)書(shū)簽管理的痛點(diǎn),下面小編就和大家聊聊具體實(shí)現(xiàn)方法吧2025-11-11
Python3中編碼與解碼之Unicode與bytes的講解
今天小編就為大家分享一篇關(guān)于Python3中編碼與解碼之Unicode與bytes的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
Python使用gTTS實(shí)現(xiàn)文本轉(zhuǎn)語(yǔ)音的終極指南
gTTS是一款基于Google翻譯API的Python文本轉(zhuǎn)語(yǔ)音庫(kù),支持100+種語(yǔ)言,只需幾行代碼即可生成MP3語(yǔ)音文件,下面我們就來(lái)看看它的具體應(yīng)用吧2026-05-05
Python?類中定義多個(gè)構(gòu)造器方法重載與泛方法
這篇文章主要為大家介紹了Python?類中定義多個(gè)構(gòu)造器方法重載與泛方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03

