实现将子组成员UID添加至父组的JS/Groovy脚本开发需求
Groovy 实现子组成员合并到父组
这里提供一个Groovy脚本,专门处理你描述的LDAP组数据合并需求——把包含在父组里的子组的所有用户成员,直接添加到父组的成员列表中:
@Grab('org.codehaus.groovy:groovy-json:3.0.17') import groovy.json.JsonSlurper def inputFile = new File('input-groups.json') // 替换成你的入站文件路径 def slurper = new JsonSlurper() // 存储子组映射:子组cn -> 子组的用户成员列表 def subgroupMap = [:] // 第一步:先收集所有子组数据 inputFile.eachLine { line -> def group = slurper.parseText(line) def groupCn = group.cn[0] // 判断是否是子组(LEGG开头) if (groupCn.startsWith('LEGG-')) { // 提取子组的用户成员(只保留uid开头的成员) def userMembers = group.member.findAll { it.startsWith('uid=') } subgroupMap[groupCn] = userMembers } } // 第二步:处理父组,合并子组成员 inputFile.eachLine { line -> def group = slurper.parseText(line) def groupCn = group.cn[0] // 判断是否是父组(LEG开头) if (groupCn.startsWith('LEG-')) { def updatedMembers = [] as Set // 用Set自动去重 updatedMembers.addAll(group.member) group.member.each { member -> // 检查成员是否是子组DN(格式为cn=LEGG-xxx,...) if (member.startsWith('cn=LEGG-')) { // 提取子组的cn名称 def subgroupCn = member.split(',')[0].replace('cn=', '') // 如果子组存在,添加其用户成员 if (subgroupMap.containsKey(subgroupCn)) { updatedMembers.addAll(subgroupMap[subgroupCn]) } } } // 输出处理后的父组数据(可修改为写入文件) println groovy.json.JsonOutput.toJson([ cn: group.cn, member: updatedMembers.toList() ]) } }
脚本说明
- 自动依赖Groovy JSON解析库,无需手动下载
- 用
Set存储成员,避免重复添加同一用户 - 完全适配你提供的每行独立JSON的输入格式
- 处理后保留父组原有成员,同时追加对应子组的所有用户成员
Node.js(JavaScript)实现方案
如果偏好JavaScript,以下是Node.js环境下的实现脚本:
const fs = require('fs'); const inputFilePath = './input-groups.json'; // 替换为你的入站文件路径 const lines = fs.readFileSync(inputFilePath, 'utf8').split('\n').filter(line => line.trim()); // 存储子组映射:子组cn -> 用户成员列表 const subgroupMap = {}; // 第一步:收集子组数据 lines.forEach(line => { try { const group = JSON.parse(line); const groupCn = group.cn[0]; if (groupCn.startsWith('LEGG-')) { // 过滤出用户成员(uid开头) const userMembers = group.member.filter(member => member.startsWith('uid=')); subgroupMap[groupCn] = userMembers; } } catch (e) { console.error(`解析行失败: ${line}`, e); } }); // 第二步:处理父组,合并子组成员 lines.forEach(line => { try { const group = JSON.parse(line); const groupCn = group.cn[0]; if (groupCn.startsWith('LEG-')) { const updatedMembers = new Set(group.member); // 去重 group.member.forEach(member => { if (member.startsWith('cn=LEGG-')) { const subgroupCn = member.split(',')[0].replace('cn=', ''); if (subgroupMap[subgroupCn]) { subgroupMap[subgroupCn].forEach(user => updatedMembers.add(user)); } } }); // 输出处理后的父组 console.log(JSON.stringify({ cn: group.cn, member: Array.from(updatedMembers) })); } } catch (e) { console.error(`解析行失败: ${line}`, e); } });
脚本说明
- 依赖Node.js环境运行
- 加入错误捕获,避免单行文法错误导致整个脚本崩溃
- 同样通过
Set实现成员去重逻辑
内容的提问来源于stack exchange,提问作者Srinu Varma Moka
相关产品推荐
相关产品推荐

