由于Windows存在管理员权限限制,执行需管理员权限的命令时会出错,

有两种方案,

1.采用python调用vbs文件,vbs调用bat文件

2.采用提供弹出用户管理员权限方式让用户确认

1.采用python调用vbs文件,vbs调用bat文件

vbs文件

cwd = CreateObject("Scripting.FileSystemObject").GetFile(Wscript.ScriptFullName).ParentFolder.Path
path = cwd & "\cmd.bat"
Set shell = CreateObject("Shell.Application")
shell.ShellExecute path,"","","runas",0 ' 0代表不显示cmd命令窗口,1代表显示cmd命令行1窗口
WScript.Quit

详细vbs 执行见此处:vbs ShellExecute命令

bat文件

bat一般为空,主要为执行python时自动写入

python文件

import os
import subprocess CMD_BAT = os.path.join(os.path.dirname(__file__), "cmd.bat")
VBS_PATH = os.path.join(os.path.dirname(__file__), "shell.vbs") def runAdmin(cmd):
"""
exec command with administrator
:param: cmd: command requiring administrator
"""
try:
# 将命令写入bat文件
with open(CMD_BAT, "w") as f:
f.write(cmd)
# 执行vbs文件
vbs_command = "wscript {}".format(VBS_PATH)
print(f"vbs_command:{vbs_command}")
sp = subprocess.Popen(
vbs_command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
print("[PID]: %s[cmd]: %s" % (sp.pid, cmd))
except Exception as e:
print(f"exec vbs fail:{e}") if __name__ == "__main__":
command = "@powershell -NoProfile -ExecutionPolicy Bypass -Command \"iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))\" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\\bin\nchoco install virtualbox -y\n"
runAdmin(command)

2.采用提供弹出用户管理员权限方式让用户确认

直接将runAdminCmdDecorator装饰在需要管理员权限执行的函数上即可

import os, sys, ctypes
from win32comext.shell.shell import ShellExecuteEx
from functools import wraps def is_user_admin():
"""
检查admin
"""
return ctypes.windll.shell32.IsUserAnAdmin() def run_as_admin():
"""
弹出管理员运行弹窗
"""
script = os.path.abspath(sys.argv[0])
print(f"script:{script}")
args = ' '.join(sys.argv[1:]) if len(sys.argv) > 1 else ''
ShellExecuteEx(lpFile=sys.executable, lpParameters=f"{script} {args}",
nShow=1, lpVerb='runas')
return def runAdminCmdDecorator(func):
@wraps(func)
def inner(*args, **kwargs):
if not is_user_admin():
run_as_admin()
else:
func(*args, **kwargs)
return inner

最新文章

  1. UML大战需求与分析--阅读笔记4
  2. struts局部、全局类型转换器
  3. 解决Android抽屉被击穿问题
  4. javascript笔记—— call 简单理解
  5. Linux 下文件名乱码(无效的编码)的解决办法
  6. NOPI读xls文件写到txt中(NPOI系列二)
  7. 分享 Xamarin.android 关于使用SQLiteOpenHelper的小白经验
  8. mybatis 一对一关联 association 返回空值
  9. mysql5.7.25安装
  10. 项目初始化mysql建库和授权
  11. JS模块化开发(四)——构建工具gulp
  12. [转]Angular4---部署---将Angular项目部署到IIS上
  13. weblogic隐藏版本号教程(10.3.6为例)
  14. SQL2008用sql语句给字段添加说明
  15. 汉字转拼音工具类java
  16. Python入门系列教程(四)字典
  17. php composer使用过程
  18. 使用mybatis提供的各种标签方法实现动态拼接Sql。这里演示where标签和if标签实现使用姓名的模糊查询和性别查询用户列表,当用户没有选择姓名以及性别时查询出所有的记录。
  19. 六、linux目录结构知识
  20. 远程连接ejabberd的mnesia数据库

热门文章

  1. Blazor和Vue对比学习(基础1.8):Blazor中实现计算属性和数据监听
  2. Servlet——HTTP状态 405 - 方法不允许
  3. Maven笔记---超详细
  4. 数据库常用DDL语句
  5. 2021.05.03【NOIP提高B组】模拟 总结
  6. 基于SqlSugar的开发框架循序渐进介绍(8)-- 在基类函数封装实现用户操作日志记录
  7. 使用FileSystemWatcher监听文件状态
  8. ASP.NET Core 应用配置指定地址和端口
  9. 七、服务器硬件及RAID配置实战
  10. python小题目练习(一)