python執行 cmd指令屬於外部呼叫,subprocess.popen 方法即可,實現如下:
參考資料《python指令碼以管理員許可權執行》# !/usr/bin/python3
# coding: utf-8
import subprocess
def command(cmd, timeout=1800000):
try:
sp = subprocess.popen(
cmd,
shell=true,
stdout=subprocess.pipe,
stderr=subprocess.pipe
)print("[pid] %s: %s" % (sp.pid, cmd))
sp.wait(timeout=timeout)
stderr = str(sp.stderr.read().decode("gbk")).strip()
stdout = str(sp.stdout.read().decode("gbk")).strip()
if "" != stderr:
raise exception(stderr)
if stdout.find("失敗") > -1:
raise exception(stdout)
except exception as e:
raise e
但當系統許可權不足時,腫麼辦?
先看傳統 bat的處理方式:
這段**的主要流程:@echo off
echo get admin rights
cacls.exe "%systemdrive%\system volume information" >nul 2>nul
if %errorlevel%==0 goto isadmin
if exist "%temp%\getadmin.vbs" del /f /q "%temp%\getadmin.vbs"
echo shell.shellexecute "%~s0","","","runas",1 >>"%temp%\getadmin.vbs"
echo wscript.quit >>"%temp%\getadmin.vbs"
"%temp%\getadmin.vbs" /f
if exist "%temp%\getadmin.vbs" del /f /q "%temp%\getadmin.vbs"
exit
:isadmin
sc stop webclient
pause
1、呼叫 cacls.exe 程式查詢「系統卷標資訊」,驗證是否具備管理員許可權
2、不具備管理員許可權時建立getadmin.vbs指令碼,指令碼內容如下
shell.shellexecute "%~s0","","","runas",1
wscript.quit
3、強制執行這個 getadmin.vbs指令碼
4、刪除 getadmin.vbs指令碼檔案 並退出
那麼getadmin.vbs指令碼又做了什麼呢?
指令碼內容只有三行
建立 shell物件
② 以管理員許可權執行當前指令碼(bat指令碼),其中引數 "%~s0"
是當前指令碼的絕對路徑,"runas"
是 shell指令 runas,"1"
是管理員許可權
③ 指令碼退出
總體流程就是bat在許可權不足情況下建立了乙個 vb指令碼,讓 vb指令碼反向呼叫bat
想要做乙個工具類,可以實現任意 cmd指令的管理員許可權下的執行
挖坑式的自造輪子:
① 建立乙個空的 bat檔案,動態寫入cmd指令
② 建立乙個固定內容的 vb指令碼
③ python呼叫 vb指令碼, vb 呼叫 bat
參考資料《vbs獲取當前路徑的兩個方法》
《vbs中字串拼接 & 與 + 的區別》
工具方法 runadmin 實現**如下:
注意:因 cmd指令是動態寫入檔案,固 runadmin 方法不支援併發,呼叫時要加執行緒鎖
# !/usr/bin/python3
# coding: utf-8
import os
import subprocess
import traceback
def runadmin(cmd, timeout=1800000):
f = none
try:
bat = os.getcwd() + r"\tool\script\cmd.bat"
f = open(bat, 'w')
f.write(cmd)
except exception as e:
traceback.print_exc()
raise e
finally:
if f:
f.close()
try:
shell = os.getcwd() + r"\tool\script\shell.vbs"
sp = subprocess.popen(
shell,
shell=true,
stdout=subprocess.pipe,
stderr=subprocess.pipe
)print("[pid] %s: %s" % (sp.pid, cmd))
sp.wait(timeout=timeout)
stderr = str(sp.stderr.read().decode("gbk")).strip()
stdout = str(sp.stdout.read().decode("gbk")).strip()
if "" != stderr:
raise exception(stderr)
if stdout.find("失敗") > -1:
raise exception(stdout)
except exception as e:
raise e
後台管理員的許可權管理實現
需求 在乙個前後端分離的專案裡,實現對於 系統管理員 類使用者的許可權管理功能。每個管理員都可以屬於乙個或者多個角色 每個角色有許可權進行乙個或者多個操作。設計 許可權控制分成兩層,分別是介面訪問許可權,和操作許可權。介面訪問許可權,通過乙個切片來實現。比如普通使用者不能訪問管理員介面。資料庫中設計...
C 程式以管理員許可權執行
cosmic spy 在vista 和 windows 7 及更新版本的作業系統,增加了 uac 使用者賬戶控制 的安全機制,如果 uac 被開啟,使用者即使以管理員許可權登入,其應用程式預設情況下也無法對系統目錄 系統登錄檔等可能影響系統正常執行的設定進行寫操作。這個機制大大增強了系統的安全性,但...
C 程式以管理員許可權執行
在vista 和 windows 7 及更新版本的作業系統,增加了 uac 使用者賬戶控制 的安全機制,如果 uac 被開啟,使用者即使以管理員許可權登入,其應用程式預設情況下也無法對系統目錄 系統登錄檔等可能影響系統正常執行的設定進行寫操作。這個機制大大增強了系統的安全性,但對應用程式開發者來說,...