python如果獲取windows管理員許可權(一)
阿新 • • 發佈:2019-02-10
我們在執行我們編寫好的python
程式碼時,會碰到這樣的報錯問題
PermissionError: [WinError 5] 拒絕訪問。
這是因為我們編寫的指令碼的許可權不夠。一種解決辦法是在管理員cmd
中執行我們的指令碼(右鍵以 run as administrator),但是這種辦法不夠優雅。我們經常看到當我們執行一些需要高許可權的軟體時,會彈出以下對話方塊
這被稱為使用者安全控制,簡稱為UAC。
- 使用者帳戶控制(User Account Control,簡寫作UAC)是微軟司在其Windows Vista及更高版本作業系統中採用的一種控制機制。其原理是通知使用者是否對應用程式使用硬碟驅動器8)和系統檔案授權,以達到幫助阻止惡意程式(有時也稱為“惡意軟體”)損壞系統的效果。
那麼我們在寫程式碼的時候怎麼新增這個功能呢?
這裡我們要用到一個關鍵的函式ShellExecute
HINSTANCE ShellExecute(
_In_opt_ HWND hwnd,
_In_opt_ LPCTSTR lpOperation,
_In_ LPCTSTR lpFile,
_In_opt_ LPCTSTR lpParameters,
_In_opt_ LPCTSTR lpDirectory,
_In_ INT nShowCmd
);
from __future__ import print_function
import ctypes, sys
def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
if is_admin():
# 將要執行的程式碼加到這裡
else:
if sys.version_info[0] == 3:
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
else:#in python2.x
ctypes.windll.shell32.ShellExecuteW(None, u"runas", unicode(sys.executable), unicode(__file__), None, 1)
要提醒你的是,不要在IDE中執行。
如果在非管理員許可權下執行的話,其實這裡運行了兩次程式碼,第一次肯定是沒有管理員許可權的,第二次擁有管理員許可權。
有的時候我們不希望有這種UAC彈框,我們希望程式偷偷的擁有管理員許可權,這要怎麼做呢?這其實挺邪惡的。感興趣的話,可以看這篇python如果獲取windows管理員許可權(二)