1. 程式人生 > >python如果獲取windows管理員許可權(一)

python如果獲取windows管理員許可權(一)

我們在執行我們編寫好的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管理員許可權(二)