Script to Add/Remove Users from group

Konner Lester
Tera Expert

I have a group called ServiceNow Managers and Above and this group is used to house any user that is a manager or a VP, etc. The point of this group is to skip approval if the Opened by person is in this group. I am wanting to manage this group automatically so I have a script that will check the user table and get a list of all of the users in the manager column. The list is then used to add all users in that list to the ServiceNow Managers and Above group. The problem I am having is that it will remove all users from the group and then add them all back. This is not a huge deal it is just not ideal. What should happen is that the script tells that a user is no longer a manager and will just remove that user. Below is the script I am using so if you have any ideas of what to change that would be great. Thanks

 

var table = 'sys_user';
var field = 'manager';
var groupId = '70cc1f671bfb1110976764e9bc4bcbff'; //Manager and Above Group

// Get the list of managers
var managers = [];
var gaDupCheck = new GlideAggregate(table); 
gaDupCheck.addNotNullQuery(field); 
gaDupCheck.groupBy(field); 
gaDupCheck.query(); 

while (gaDupCheck.next()) { 
    var managerSysId = gaDupCheck.getValue('manager');
    managers.push(managerSysId);
}

// Remove non-managers from the group
var groupMembers = new GlideRecord('sys_user_grmember');
groupMembers.addQuery('group', groupId);
groupMembers.query();

while (groupMembers.next()) {
    var userId = groupMembers.getValue('user');
    if (!managers.includes(userId)) {
        groupMembers.deleteRecord();
        gs.info('User with sys_id "' + userId + '" removed from group with sys_id "' + groupId + '".');
    }
}

// Add new managers to the group
for (var i = 0; i < managers.length; i++) {
    var newManagerSysId = managers[i];

    var newGroupMember = new GlideRecord('sys_user_grmember');
    newGroupMember.initialize();
    newGroupMember.user = newManagerSysId;
    newGroupMember.group = groupId;
    newGroupMember.insert();
    gs.info('Added user with sys_id "' + newManagerSysId + '" to group with sys_id "' + groupId + '".');
}

 

 

2 ACCEPTED SOLUTIONS

Martin Ivanov
Giga Sage
Giga Sage

Hi. Includes is not working here. To make it work do the following:


add this row at the begining of your code:

var arrayUtil = new ArrayUtil();

Then go-ahead to line

 if (!managers.includes(userId)) {

and replace it with

if(!arrayUtil.contains(managers, userId)){

I believe the whole script must look like that: 

var table = 'sys_user';
var field = 'manager';
var groupId = '70cc1f671bfb1110976764e9bc4bcbff'; //Manager and Above Group

// Get the list of managers
var managers = [];
var gaDupCheck = new GlideAggregate(table); 
gaDupCheck.addNotNullQuery(field); 
gaDupCheck.groupBy(field); 
gaDupCheck.query(); 

while (gaDupCheck.next()) { 
    var managerSysId = gaDupCheck.getValue('manager');
    managers.push(managerSysId);
}

// Remove non-managers from the group
var groupMembers = new GlideRecord('sys_user_grmember');
groupMembers.addQuery('group', groupId);
groupMembers.query();

while (groupMembers.next()) {
    var userId = groupMembers.getValue('user');
    if(!arrayUtil.contains(managers, userId)){
        groupMembers.deleteRecord();
        gs.info('User with sys_id "' + userId + '" removed from group with sys_id "' + groupId + '".');
    }
}

// Add new managers to the group
for (var i = 0; i < managers.length; i++) {
    var newManagerSysId = managers[i];

    var newGroupMember = new GlideRecord('sys_user_grmember');
    newGroupMember.initialize();
    newGroupMember.user = newManagerSysId;
    newGroupMember.group = groupId;
    newGroupMember.insert();
    gs.info('Added user with sys_id "' + newManagerSysId + '" to group with sys_id "' + groupId + '".');
}

Let me know if it works.


Please mark Correct and click the Thumb up if my answer helps you resolve your issue. Thanks!
Martin Ivanov
ServiceNow MVP 2023, 2024

View solution in original post

Hi @Konner Lester 

 

You actually have two issues going on here at the same time. Not only do you want to remove users from the group that are no longer managers, but you also only want to add users that are not already in the group. Like @Martin Ivanov said the "includes" was not working and you need to use the ArrayUtil with a contains to delete the users that are no longer needed. However you also need to build an array of the current group members and do a "diff" of them vs the managers array so you know which users need to be added. I've updated your code to handle this, please see below. I've run this in my PDI and it's working as expected.

var table = 'sys_user';
var field = 'manager';
var groupId = '70cc1f671bfb1110976764e9bc4bcbff'; //Manager and Above Group
var arrayUtil = new ArrayUtil();

// Get the list of managers
var managers = [];
var gaDupCheck = new GlideAggregate(table);
gaDupCheck.addNotNullQuery(field);
gaDupCheck.groupBy(field);
gaDupCheck.query();

while (gaDupCheck.next()) {
    var managerSysId = gaDupCheck.getValue('manager');
    managers.push(managerSysId);
}

// Control Group Membership for Managers and Non-Managers
var members = [];
var groupMembers = new GlideRecord('sys_user_grmember');
groupMembers.addQuery('group.sys_id', groupId);
groupMembers.query();

while (groupMembers.next()) {
    var userId = groupMembers.getValue('user');
    members.push(userId);
    if (!arrayUtil.contains(managers, userId)) {
        groupMembers.deleteRecord();
        gs.info('User with sys_id "' + userId + '" removed from group with sys_id "' + groupId + '".');
    }
}

//Check the Managers array against the current group members array and insert any NEW managers.
var difference = arrayUtil.diff(managers, members);
if (difference) {
    for (var i = 0; i < difference.length; i++) {
        var newManagerSysId = difference[i];

        var newGroupMember = new GlideRecord('sys_user_grmember');
        newGroupMember.initialize();
        newGroupMember.user = newManagerSysId;
        newGroupMember.group = groupId;
        newGroupMember.insert();
        gs.info('Added user with sys_id "' + newManagerSysId + '" to group with sys_id "' + groupId + '".');
    }
}

View solution in original post

5 REPLIES 5

Martin Ivanov
Giga Sage
Giga Sage

Hi. Includes is not working here. To make it work do the following:


add this row at the begining of your code:

var arrayUtil = new ArrayUtil();

Then go-ahead to line

 if (!managers.includes(userId)) {

and replace it with

if(!arrayUtil.contains(managers, userId)){

I believe the whole script must look like that: 

var table = 'sys_user';
var field = 'manager';
var groupId = '70cc1f671bfb1110976764e9bc4bcbff'; //Manager and Above Group

// Get the list of managers
var managers = [];
var gaDupCheck = new GlideAggregate(table); 
gaDupCheck.addNotNullQuery(field); 
gaDupCheck.groupBy(field); 
gaDupCheck.query(); 

while (gaDupCheck.next()) { 
    var managerSysId = gaDupCheck.getValue('manager');
    managers.push(managerSysId);
}

// Remove non-managers from the group
var groupMembers = new GlideRecord('sys_user_grmember');
groupMembers.addQuery('group', groupId);
groupMembers.query();

while (groupMembers.next()) {
    var userId = groupMembers.getValue('user');
    if(!arrayUtil.contains(managers, userId)){
        groupMembers.deleteRecord();
        gs.info('User with sys_id "' + userId + '" removed from group with sys_id "' + groupId + '".');
    }
}

// Add new managers to the group
for (var i = 0; i < managers.length; i++) {
    var newManagerSysId = managers[i];

    var newGroupMember = new GlideRecord('sys_user_grmember');
    newGroupMember.initialize();
    newGroupMember.user = newManagerSysId;
    newGroupMember.group = groupId;
    newGroupMember.insert();
    gs.info('Added user with sys_id "' + newManagerSysId + '" to group with sys_id "' + groupId + '".');
}

Let me know if it works.


Please mark Correct and click the Thumb up if my answer helps you resolve your issue. Thanks!
Martin Ivanov
ServiceNow MVP 2023, 2024

Hi @Konner Lester 

 

You actually have two issues going on here at the same time. Not only do you want to remove users from the group that are no longer managers, but you also only want to add users that are not already in the group. Like @Martin Ivanov said the "includes" was not working and you need to use the ArrayUtil with a contains to delete the users that are no longer needed. However you also need to build an array of the current group members and do a "diff" of them vs the managers array so you know which users need to be added. I've updated your code to handle this, please see below. I've run this in my PDI and it's working as expected.

var table = 'sys_user';
var field = 'manager';
var groupId = '70cc1f671bfb1110976764e9bc4bcbff'; //Manager and Above Group
var arrayUtil = new ArrayUtil();

// Get the list of managers
var managers = [];
var gaDupCheck = new GlideAggregate(table);
gaDupCheck.addNotNullQuery(field);
gaDupCheck.groupBy(field);
gaDupCheck.query();

while (gaDupCheck.next()) {
    var managerSysId = gaDupCheck.getValue('manager');
    managers.push(managerSysId);
}

// Control Group Membership for Managers and Non-Managers
var members = [];
var groupMembers = new GlideRecord('sys_user_grmember');
groupMembers.addQuery('group.sys_id', groupId);
groupMembers.query();

while (groupMembers.next()) {
    var userId = groupMembers.getValue('user');
    members.push(userId);
    if (!arrayUtil.contains(managers, userId)) {
        groupMembers.deleteRecord();
        gs.info('User with sys_id "' + userId + '" removed from group with sys_id "' + groupId + '".');
    }
}

//Check the Managers array against the current group members array and insert any NEW managers.
var difference = arrayUtil.diff(managers, members);
if (difference) {
    for (var i = 0; i < difference.length; i++) {
        var newManagerSysId = difference[i];

        var newGroupMember = new GlideRecord('sys_user_grmember');
        newGroupMember.initialize();
        newGroupMember.user = newManagerSysId;
        newGroupMember.group = groupId;
        newGroupMember.insert();
        gs.info('Added user with sys_id "' + newManagerSysId + '" to group with sys_id "' + groupId + '".');
    }
}

That works flawlessly! Thank you @Martin Ivanov and @Joe S1 for the help.

Good catch Joe! @Konner Lester, I think you can now accept more than one sultion as correct. If you feel mine has helped somehow, please try to mark it correct. Thanks!


Please mark Correct and click the Thumb up if my answer helps you resolve your issue. Thanks!
Martin Ivanov
ServiceNow MVP 2023, 2024