Python實現管理員許可權執行CMD指令

2021-09-11 21:27:13 字數 3433 閱讀 4910

python執行 cmd指令屬於外部呼叫,subprocess.popen 方法即可,實現如下:

# !/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

參考資料《python指令碼以管理員許可權執行》

但當系統許可權不足時,腫麼辦?

先看傳統 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 被開啟,使用者即使以管理員許可權登入,其應用程式預設情況下也無法對系統目錄 系統登錄檔等可能影響系統正常執行的設定進行寫操作。這個機制大大增強了系統的安全性,但對應用程式開發者來說,...