一、subprocess.Popen

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 获取管理员权限

但当系统权限不足时,肿么办?

先看传统 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 Set shell = CreateObject^("Shell.Application"^)>"%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脚本,脚本内容如下

Set shell = CreateObject("Shell.Application")

shell.ShellExecute "%~s0","","","runas",1

WScript.Quit

3、强制执行这个 getAdmin.vbs脚本

4、删除 getAdmin.vbs脚本文件 并退出

那么getAdmin.vbs脚本又做了什么呢?

脚本内容只有三行

① Set shell = CreateObject("Shell.Application")创建 Shell对象

② 以管理员权限运行当前脚本(bat脚本),其中参数 "%~s0" 是当前脚本的绝对路径,"runas"是 shell指令 runas,"1"是管理员权限

③ 脚本退出

总体流程就是 bat在权限不足情况下创建了一个 vb脚本,让 vb脚本反向调用bat

三、Python 的曲线救国

想要做一个工具类,可以实现任意 cmd指令的管理员权限下的执行

挖坑式的自造轮子:

① 创建一个空的 bat文件,动态写入cmd指令

② 创建一个固定内容的 vb脚本

③ Python调用 vb脚本, vb 调用 bat

1、文件结构

2、../tool/script/shell.vbs

cwd = CreateObject("Scripting.FileSystemObject").GetFile(Wscript.ScriptFullName).ParentFolder.Path

path = cwd & "\cmd.bat"

Set shell = CreateObject("Shell.Application")

shell.ShellExecute path,"","","runas",1

WScript.Quit

参考资料

《VBS获取当前路径的两个方法》

《VBS中字符串拼接 & 与 + 的区别》

3、方法实现

工具方法 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

如有纰漏,敬请@

python可执行程序必须以管理员_Python实现管理员权限运行CMD指令相关推荐

  1. Python实现管理员权限运行CMD指令

    可使用 #!/usr/bin/env python # coding:utf8 import subprocess cmd="net user test3 123456 /add" ...

  2. 已使用管理员权限运行CMD,仍报错OSError: [WinError 5] 拒绝访问。: ‘E:\\Code\\Python\\Git\\stable-diffusion-webui\\venv\\

    已使用管理员权限运行CMD,仍报错OSError: [WinError 5] 拒绝访问.: 'E:\\Code\\Python\\Git\\stable-diffusion-webui\\venv\\ ...

  3. java 以管理员执行cmd_cmd管理员代码 JAVA 管理员权限运行CMD文件

    敲什么命令可以以管理员身份启动cmd 我建了一个.bat文件,想启动mysql服务,但是必须是以管理员身份去启动才代码如下: @echo off>nul 2>&1 "%S ...

  4. 管理员权限运行CMD命令

    我们在日常工作使用CMD进行命令操作时,经常会遇到需要管理员权限才可以运行命令,那么怎么以管理员权限运行CMD命令? 其实很简单使用三步就行了"运行--cmd--CTRL+shift+ent ...

  5. python运行cmd指令

    虽然python在调用cmd命令方面使用的比较少,不过还是要用的.一起来看! 使用OS模块 用命令system(),运行cmd指令. import os os.system("ipconfi ...

  6. python语言程序的特点_Python语言概述及其运行机制详解

    即日起,我们将打开一个新的编程世界的大门--Python语言.Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新 ...

  7. 管理员权限运行cmd

    1.键盘按下"win+R",弹出运行窗口,在里面输入"cmd". 这时我们已经进入普通的cmd模式,如何进入管理员cmd呢? 2.接下来输入:runas /us ...

  8. python加载包出错_python导入Pmw包运行提示一下错误

    我是Centos7.2的系统 python版本是2.7.5 错误提示: Traceback (most recent call last): File "./py020.py", ...

  9. python画球轨迹图_python绘制铅球的运行轨迹代码分享

    我们按照面向过程程序设计的思想,使用python编写了程序,追踪铅球在运行过程中的位置信息.下面,修改程序代码,导入turtle模块,将铅球的运行轨迹绘制出来. python3代码如下: from m ...

  10. python学生管理系统设计原理_Python建造者模式案例运行原理解析

    建造者模式的适用范围:想要创建一个由多个部分组成的对象,而且它的构成需要一步接一步的完成.只有当各个部分都完成了,这个对象才完整.建造者模式表现为复杂对象的创建与表现相分离,这样,同一个过程就有不同的 ...

最新文章

  1. TensorFlow实现人脸检测和人脸识别
  2. ACdream 1431 Sum vs Product
  3. LeetCode Algorithm 1052. 爱生气的书店老板
  4. 查找字符串中首个非重复字符
  5. python手机编译器可以干什么_Python是什么?Python学习用哪些编译器?
  6. 计算机课伤害事故的防范,体育课安全伤害事故的防范与处理
  7. be my friend
  8. Java项目课程01:课程概述
  9. 在ASP.NET中实现AJAX
  10. python写spark_python开发sparkSQL应用
  11. leetcode 221. Maximal Square 求一个数组中由1组成的最大的正方形面积 ---------- java...
  12. DB2 表的常用命令
  13. Java:Map转List (用stream实现)
  14. Swift游戏实战-跑酷熊猫 02 创建熊猫类
  15. NLP与ChatGPT的碰撞:大模型和小模型联合发力
  16. 关于APP inventor 2 模拟器AI伴侣版本不一致的问题解决
  17. 常用的 Druid 参数
  18. CE认证和CCC认证区别?
  19. can not access a member of class xxx with modifiers “private“
  20. 一条简单 SQL 执行耗时超 1000ms,问题解决全过程!

热门文章

  1. JavaScript打飞机小游戏
  2. linux cpu飙高原因排查(有手就行)
  3. 小散量化炒股记|Python也能量化财务指标!教你用净资产收益率选股!
  4. FeedDemon,浏览Blog的好工具
  5. html5 浮标,【钓鱼技巧】主说调与钓 附5个实战技巧
  6. 六、利用ESP32搭建网络服务器(一)
  7. forEach和map的区别,简单写了IE低版本的原形封装
  8. 阿尔山自驾游(2010年8月中旬,北京出发)
  9. C#应用程序界面开发基础——窗体控制(4)——选择类控件(有部分地方没明白)
  10. 关于桌面文件,软件图标,带蓝底白问号的解决方法