QQ群里的Evan童鞋分享了一个很有意思的博客 http://note.youdao.com/noteshare?id=a60709c00fe88cd09155a2ef50815281  大概是如何利用Flask 调用 Powershell API 实现的一个运维管理系统。


豆子依葫芦画瓢,用Django成功地实现了有一个简单的界面。 直接用Bootstrap模板弄个前端页面,Django 框架,然后后台调用PowerShell API实现查询。


下面是一个简单的demo,输入AD的组,显示组成员


Django+ PowerShell 管理AD系统_第1张图片


Django没啥好说的,基本的MTV框架流程,主要比较好玩的是这个PowerShell API的模块。网上有现成的HttpListener的模块可以下载,QQ群里的童鞋做了些修改,去掉了一个验证的功能,如果有需求,可以自己手动添加一个函数进去。我这里图省事是直接用的去验证的版本。


这个模块下载导入之后就可以执行了,他提供了一个类似restful的接口来执行Powershell的命令,直接Http get请求对应的接口,然后返回json格式的结果

Import-Module C:\users\yuan.li\Documents\GitHub\Powershell\HTTPListener.psm1
start-httplistener -verb -Auth None


测试一下:

浏览器

Django+ PowerShell 管理AD系统_第2张图片

Python

Django+ PowerShell 管理AD系统_第3张图片




值得一提的是,具体的Powershell命令放在哪里,我们可以在两个地方设置。一个是直接在uri里面 command=后面输入,简单的命令无所谓,但是如果命令很复杂很长的话,这里就不是太合适了;


另外一个方式是可以在HTTPListener的模块文件里面直接写个function,这样加载的时候一起放入内存了。command=后面直接跟函数名和参数就行了。

比如说:


function search-adgroupmemeber($group){
    Get-ADGroupMember $group | select name, SamAccountName,Distinguishedname
}


那我直接调用

http://localhost:8888/?command=search-adgroupmemeber 'domain admins'


显示结果

Django+ PowerShell 管理AD系统_第4张图片



okay,基本能工作了,那么在django上弄个界面看看吧


url.py 路由

url(r'^powershell', views.powershell),


views.py 视图函数

import requests
def powershell(req):
    if req.method=="GET":
        return render(req,'powershell.html')
    elif req.method=="POST":
        name=req.POST.get("caption")
        print(name)
        res=requests.get("http://localhost:8888/?command=get-adgroupmember '%s' | select name, distinguishedname"%name)
        print(res)
        result=res.json()
        print(result)
        return render(req,'powershell.html',{'result':result})


powershell.html 模板,这里我没用AJAX,就是直接form进行提交

{%  extends 'base.html' %}
{% block css %}
    
{% endblock %}
{% block content %}
Powershell 测试页面
查询用户组
            
                {% csrf_token %}
                
                
            

                                           成员                 DN                 操作                                {% for items in result %}              `items`.`name`         `items`.`distinguishedname`         修改 | 删除      {% endfor %}                 {% endblock %} {% block title%}PowerShell{% endblock %} {% block js%} {% endblock %}


这样一个查询效果就做出来了。