ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

python 执行需要管理员权限的命令(Windows)

2022-05-28 11:03:04  阅读:419  来源: 互联网

标签:__ bat python cmd vbs Windows 管理员 path command


由于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

标签:__,bat,python,cmd,vbs,Windows,管理员,path,command
来源: https://www.cnblogs.com/xy-bot/p/16320045.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有