Python程序自動(dòng)以管理員權(quán)限運(yùn)行的實(shí)現(xiàn)方法
前言
由于Windows的安全機(jī)制,Python寫的腳本缺少了管理員權(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)文章
python實(shí)現(xiàn)將pvr格式轉(zhuǎn)換成pvr.ccz的方法
這篇文章主要介紹了python實(shí)現(xiàn)將pvr格式轉(zhuǎn)換成pvr.ccz的方法,涉及Python實(shí)現(xiàn)格式轉(zhuǎn)換的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04Python實(shí)現(xiàn)對(duì)相同數(shù)據(jù)分箱的小技巧分享
這篇文章主要給大家介紹了關(guān)于Python實(shí)現(xiàn)對(duì)相同數(shù)據(jù)分箱的小技巧,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01學(xué)習(xí)Python3 Dlib19.7進(jìn)行人臉面部識(shí)別
本篇文章主要給大家詳細(xì)介紹了Python3利用Dlib19.7進(jìn)行人臉面部識(shí)別的相關(guān)知識(shí),一起學(xué)習(xí)參考下吧。2018-01-01python語(yǔ)言元素知識(shí)點(diǎn)詳解
在本篇文章中小編給大家分享了關(guān)于python語(yǔ)言元素的相關(guān)知識(shí)點(diǎn)以及實(shí)例代碼,需要的朋友們跟著學(xué)習(xí)下。2019-05-05詳解Python設(shè)計(jì)模式編程中觀察者模式與策略模式的運(yùn)用
這篇文章主要介紹了Python設(shè)計(jì)模式編程中觀察者模式與策略模式的運(yùn)用,觀察者模式和策略模式都可以歸類為結(jié)構(gòu)型的設(shè)計(jì)模式,需要的朋友可以參考下2016-03-03python實(shí)現(xiàn)兩個(gè)文件合并功能
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)兩個(gè)文件合并功能,一個(gè)簡(jiǎn)單的文件合并程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04寫一個(gè)Python腳本自動(dòng)爬取Bilibili小視頻
這篇文章主要介紹了寫一個(gè) Python 腳本自動(dòng)爬取 Bilibili 小視頻的示例代碼,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-04-04pandas計(jì)數(shù) value_counts()的使用
這篇文章主要介紹了pandas計(jì)數(shù) value_counts()的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06