How to sync Parent group members to Child groups

billi_lumley
ServiceNow Employee
ServiceNow Employee

Hello!   Looking for a business rule or SI to sync parent group members to child groups when a new members is added to a parent group.   I had created a business rule on the group member table; however I'm not having any luck.

//check if group is a Parent

var grp = new GlideRecord("sys_user_group");

grp.addQuery("parent", current.group);

grp.addQuery('type', 'CONTAINS', '7e741272efe2010047920fa3f8225643'); //human_resources

grp.addQuery('active', true);

grp.query();

//if group exists as parent, assign new user to the child groups

while (grp.next()) {

  var mem = new GlideRecord("sys_user_grmember");

  mem.addQuery("user", current.user);

  mem.addQuery("group", grp.group);

  mem.query();

  //This is checking to see if group record already exists? - What if they were added to the group prior to this rule being instituted?

  if (!mem.next()) {

  mem.user = current.user;

  mem.group = grp.group;

  mem.insert();

  }

}

1 ACCEPTED SOLUTION

Chuck Tomasi
Tera Patron

Here you go Billi. No charge for the PS time. 🙂 Comments at the top indicate how to set up the business rule. This thing adds AND deletes members from the child tables. 🙂 Don't forget to dump this stuff inside the existing wrapper function that comes with default AFTER business rules.

 

// Table sys_user_grmember
// Insert: true
// Update: true
// When: After
// Condition current.group.getDisplayValue() == 'HR Parent'

//find active child groups
var childArr = [];
var thisUser = current.getValue('user');
var grp = new GlideRecord('sys_user_group'); grp.addEncodedQuery('active=true^parent=' + current.getValue('group')); grp.query(); gs.print('count=' + grp.getRowCount()); while (grp.next()) { childArr.push(grp.getValue('sys_id')); gs.print(grp.getDisplayValue()); } // Add user to the child groups if (current.operation() == 'insert') { gs.print('INSERT'); for (var i = 0; i < childArr.length; i++) { if (userInGroup(thisUser, childArr[i])) { gs.print('user is already in the group ' + childArr[i]); continue; } addUserToGroup(thisUser, childArr[i]); } } // Remove user from child groups if (current.operation() == 'delete') { gs.print('DELETE'); for (var i = 0; i < childArr.length; i++) { if (!userInGroup(thisUser, childArr[i])) { gs.print('user is NOT in the group ' + childArr[i]); continue; } deleteUserFromGroup(thisUser, childArr[i]); } } function userInGroup(user, group) { var ug = new GlideRecord('sys_user_grmember'); var q = 'user=' + user + '^group=' + group; // user=46d44a23a9fe19810012d100cca80666^group=dc8d86c213d31200ae44b4622244b03d // HR Child1 (want to see) // user=46d44a23a9fe19810012d100cca80666^group=a49d86c213d31200ae44b4622244b0e9 // Got (3) ug.addEncodedQuery(q); ug.query(); gs.print('userInGroup(): q=' + q + ' count=' + ug.getRowCount()); return ug.hasNext(); } function deleteUserFromGroup(user, group) { if (!user) return; if (!group) return; var ug = new GlideRecord('sys_user_grmember'); var q = 'user=' + user + '^group=' + group; // user=46d44a23a9fe19810012d100cca80666^group=dc8d86c213d31200ae44b4622244b03d // HR Child1 (want to see) // user=46d44a23a9fe19810012d100cca80666^group=a49d86c213d31200ae44b4622244b0e9 // Got (3) ug.addEncodedQuery(q); ug.query(); gs.print('deleteUserFromGroup(): q=' + q + ' count=' + ug.getRowCount()); if (ug.next()) { gs.print('delete'); ug.deleteRecord(); } } function addUserToGroup(user, group) { if (!user) return; if (!group) return; var ug = new GlideRecord('sys_user_grmember'); ug.newRecord(); ug.user = user; ug.group = group; ug.insert(); gs.print('insert'); }

 

View solution in original post

16 REPLIES 16

Hello everyone,

I also had a task to sync parent and child groups. The requirement is for the parent group to be in a different domain from the child group and the syncing should be across domains. Does anyone have any idea of what I can do to trigger this?

 

ying zeng
Tera Contributor

BR

yingzeng_0-1675305275782.png

(function executeRule(current,previous){
	
	var gr_grm= new GlideRecord('sys_user_grmember');
	gr_grm.addQuery('group',current.parent);
	gr_grm.query();
    
	while(gr_grm.next()){
		var gr_grm_ins = new GlideRecord('sys_user_grmember');
		gr_grm_ins.user = gr_grm.user;
		gr_grm_ins.group = current.sys_id;
		gr_grm_ins.insert();
        gs.addInfoMessage('test');
	}
}) (current,previous);