node-autoAdd,可以实现自动创建和删除WindowsServer域账号的接口

本文介绍了使用Node.js开发的HTTP服务端,处理来自域控和综管资产的接口请求,实现账号组织单位管理,包括添加、删除和创建四级组织及域账号的过程。通过axios调用外部API,利用DSQuery和DSRM命令行工具进行操作。
摘要由CSDN通过智能技术生成
const { exec } = require('child_process')
const cmd = require('node-cmd')
const express = require('express')
const bodyParser = require('body-parser')
const logger = require('./logs/logger')
const iconv = require('iconv-lite')
const axios = require('axios')
const app = express()


let off
iconv.skipDecodeWarning = true;
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

//域控后端传回接口
app.post('/DomainPort',(req, res) => {
    logger.info(req.body)
    let copyData = req.body
    let threeData = req.body

    axiosPostDomain(threeData)
        setTimeout(() => {
            if(copyData.type == 'add') {
                findOu(req.body,req.body,copyData,res,off)
            }else {
                findUserOuDel(copyData,res,off)
            }
        }, 1500);
    axiosPostAsset(threeData)
    
})

app.listen(5222, () => {
    console.log('HTTP服务端启动,端口为5222')
})


//传给3楼域控和综管资产接口
function axiosPostDomain(data) {
    axios.post('http://www.baidu.com', {data})//填自己的url
        .then((res) => {
            off = res.data
            logs("来自三楼的回应",res.data)
        })
        .catch((err) => {})
}

function axiosPostAsset(data) {
    axios.post('http://www.baidu.com', {data})//填自己的url
        .then((res) => {
            logs("来自综管资产接口回应" + res.data)
        })
        .catch((err) => {
            logs("来自综管资产接口错误" + err)
        })
}
//查找账号所在的组织单位,没有查询到不执行操作,查询到就删除(新的删除方法)
function findUserOuDel(data,res,off) {
    exec(`dsquery user -name ${data.name}`, { encoding: 'buffer' }, (err, stdout) => {
        let circulation = iconv.decode(stdout, 'cp936').replace(/[\r\n]/g,"")
        if(circulation.length < 1) {
            logs(`来自五楼删除信息:${data.name} | 此账号没有查询到或者已经删除成功`)
            if(off.code == 1007) {
                res.send(returnData("删除","success1000",'',off,1000))
            }else {
                res.send(returnData("删除","success1003",'',off,1003))
            }   
        }else {
            exec(`dsrm ${circulation} -noprompt -c`, { encoding: 'buffer' }, (err, stdout) => {
              if(err){
                logs(err)
                if(off.code == 1007) {
                    res.send(returnData("删除","err1005",err,off,1005))
                }else {
                    res.send(returnData("删除","err1008",err,off,1008))
                } 
              }else {
                let circulationData1 = iconv.decode(stdout, 'cp936')
                logs("五楼删除信息:" + circulationData1) 
                res.send(returnData("删除","success1000",'',off,1000))
              }
            })
        }
    })
  }

//查找目录里是否存在该组织单位,未找到和查找失败会新建组织单位
function findOu(data,data2,data3,data4,off) {
    cmd.run(`dsquery ou ${ouFiltrateThree(data2)},DC=knownsec,DC=com`,
    function(err,tempData){
        if(err) {
            logs("未找到三级组织单位或查找失败","正在尝试新建三级组织单位")
            addOuThree(data2,data3,data4,off)
        }else {
            logs("已找到三级组织","单位")
            cmd.run(`dsquery ou ${ouFiltrate(data)},DC=knownsec,DC=com`,
            function(err,tempData){
                if(err) {
                    logs("未找到四级组织单位或查找失败","正在尝试新建四级组织单位")
                    addOu(data,data3,data4,off)
                }else {
                    logs("已找到四级组织","单位")
                    addUser(data3,data4,off)
                }    
            })
        }    
    })
   
}

//创建四级组织单位并创建域账号
function addOu(data,data3,data4,off) {
    cmd.run(`dsadd ou ${ouFiltrate(data)},DC=knownsec,DC=com`,
    function(err,tempdata){
        if(err) {
            logs("创建四级组织单位失败:",err)
        }else {
            logs("创建四级组织单位","成功")
            addUser(data3,data4,off)
        }     
    })
}

//创建三级组织单位并查询是否满足创建四级单位的条件,如果满足即会递归创建四级单位。
function addOuThree(data,data3,data4,off) {
    cmd.run(`dsadd ou ${ouFiltrateThree(data)},DC=knownsec,DC=com`,
    function(err,tempdata){
        if(err) {
            logs("创建三级组织单位失败:",err)
        }else {
            logs("创建三级组织单位","成功")
            addOu(data,data3,data4,off)
        }    
    })
}

//用/分隔出部门名称并返回一个数组
function groupFiltrate(data) {
    data.department = data.department.split("/")
    return data
} 


//传入接收到的数据返回添加完OU字段的字符串,反序数组为创建账号使用(返回值为反序的OU字符串)
function ouFiltrate(data) {
    let temp
    if(typeof(data.department) == 'string'){
        temp = groupFiltrate(data)
    }else {
        temp = data
    }
    let tempArr = []
    for(let i = 1; i < 4;i++){
        tempArr[i-1] = 'ou=' + temp.department[i]
    }
    tempString = tempArr.reverse().join()
    return tempString
}

//临时bug解决(后续可根据返回部门数组的长度进行判断)
function ouFiltrateThree(data) {
    let temp
    if(typeof(data.department) == 'string'){
        temp = groupFiltrate(data)
    }else {
        temp = data
    }
    let tempArr = []
    for(let i = 1; i < 3;i++){
        tempArr[i-1] = 'ou=' + temp.department[i]
    }
    tempString = tempArr.reverse().join()
    return tempString
}
//创建账号方法
function addUser(data,res,off) {
    cmd.run(`dsadd user cn=${data.name},${ouFiltrate(data)},dc=knownsec,dc=com -samid ${data.user} -display ${data.name}  -upn ${data.user}@knownsec.com -pwd ${data.password} -disabled no -mustchpwd yes`,
        function(err,tempdata){
            if(err) {
                logs("五楼添加域账号失败:",err)
                if(off.code == 1005) {
                    res.send(returnData("创建","err1005",err,off,1005))
                }else {
                    res.send(returnData("创建","err1008",err,off,1008))
                }
                
            }else {
                logs("五楼添加域账号","成功")
                if(off.code == 1005) {
                    res.send(returnData("创建","success1000",'',off,1000))
                }else {
                    res.send(returnData("创建","success1003",'',off,1003))
                }
                
            }      
        }
)
}

//日志
function logs(str,data) {
    logger.info(str,data)
}

//返回接口的数据方法
function returnData(dataHeader,type,err,threeData,code){
    const oneSuccessReturn = {
            "code":code,
            "message": dataHeader + "三楼和五楼域账号成功",
    }

    const oneErrReturn = {
            "code":code,
            "message": dataHeader + "五楼域账号失败," + dataHeader + "三楼域账号成功",
            "err":err
    }
    const doubleSuccessReturn = {
            "code":code,
            "message": dataHeader + "五楼域账号成功," + dataHeader + "三楼域账号失败",
            "err":err
    }

    const doubleErrReturn = {
            "code":code,
            "message": dataHeader + "三楼和五楼域账号失败",
            "err":err
    }
    switch(type) {
        case "success1000":
           return oneSuccessReturn
        case "success1003":
           return doubleSuccessReturn
        case "err1005":
           return oneErrReturn
        default:
           return doubleErrReturn
   } 
}


命令:dsquery http://technet.microsoft.com/en-us/library/cc755655.aspx 工具:oldcmp 使用OldCmp,你可以搜索、禁用或者删除非活动计算机账号。甚至更好的是,你可以创建一个简单的批处理文件来使这个过程自动化。当你用OldCmp来执行一个搜索的时候,你必须指定以下三种可能选项中的至少一种:-report(生成一张列有非活动计算机账号的HTML报告列表),-disable(禁用非活动计算机账号),-delete(删除非活动计算机账号)。如果你运行OldCmp时只加了-report选项,它会搜索你默认中所有计算机密码老化日期大于90天的计算机对象,并且把结果生成为一个HTML报告。如果你的非常大,并且里面有很多计算机账号,这条命令可能得花上一段时间来执行完毕。为了减少OldCmp的运行时间,你可以使用-b选项来指定一个特定的组织单元。OldCmp生成的HTML文件会被放到该工具的运行目录下,除非你用-file选项指定了一个替换位置。如果你包括了-sh选项,OldCmp会在生成HTML文件后自动打开它。如果你想定期地生成HTML报告,你所需要做地全部就是创建一个只包含两行代码的批处理(.bat)文件,如表1所示。其中第一行运行OldCmp,而第二行运行Blat。Blat是一个把文件内容通过电子邮件发送出去的工具,你可以从http://blat.net下载该工具。在第二行中,注意用-to选项设置你自己的电子邮件地址。另外,确认OldCmp和Blat都被放到了你的运行路径下(即在PATH环境变量中定义的路径)。建立了批处理文件之后,你需要创建一个计划任务。确认你为其指定了一个合适的账号和密码,使该脚本有足够的权限在中查询计算机对象。辨别非活动计算机账号很有帮助,但更可能的是,你有时候想清除那些账号。我的一般建议是先禁用那些非活动账号,然后经过一个星期或一个月的观察,再删除那些禁用了的账号。这样能保证确实没有人在使用我们删掉的那些账号。表2包含的批处理文件是用来删除禁用的计算机账号,以及禁用新发现的非活动计算机账号的。这个批处理文件有两段命令(注意不要交换次序)。第一段用OldCmp删除禁用了的计算机账号,并且创建deleted_comps.html报告,接着用Blat把该报告发送到XXX@XXX.com。第二段用OldCmp禁用所有计算机密码旧于180天的计算机账号,并且创建disabled_comps.html报告,接着用Blat发送该报告。在写OldCmp的时候,Joe考虑到人们可能会意外地删除或禁用数以千计的计算机账号,所以他加了一些预防措施,包括你所见到的在每个命令集中都有的-safety和-forreal选项。-safety选项用来限制脚本所能删除或者禁用的账号数量。默认情况下,OldCmp不会删除或禁用超过10个账号。若把-safety选项值设为100,则OldCmp最多可以删除100个账号。-forreal选项用来真正删除或者禁用账号。如果不用-forreal选项,OldCmp只会报告它要删除或禁用的账号,而不会真正地删除或者禁用它们。在使用表2中的批处理文件之前,你需要自定义在两行Blat命令中的电子邮件地址。此外切记,为了测试,你应该先去掉两行OldCmp命令中的-forreal选项,然后运行批处理文件来确定OldCmp将要删除或者禁用的账号无误。表1:建立非活动计算机账号报告的批处理文件oldcmp -report -file c:\inactive.htmlblat c:\inactive.html -to XXX@XXX.com -html表2:删除被禁用的计算机账号和禁用新发现的非活动计算机账号的批处理文件oldcmp -delete -onlydisabled -safety 100 -forreal -append -file c:\deleted_comps.htmlblat c:\deleted_comps.html -to XXX@XXX.com -htmloldcmp -disable -age 180 -safety 100 -forreal -append -file c:\disabled_comps.htmlblat c:\disabled_comps.html -to XXX@XXX.com -html
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值