Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

How to query for users by filtering on a specific sys_user_group name?

Todd O
Tera Guru

I have a basic need to I could whip out in a minute with plain old SQL. But, I'm having trouble doing the same thing in GlideRecord joins.   Here is my goal...

I have a sys_user_group named "Todd Group."   I basically want to find all users that are part of that group. Therefore, I believe I need to join the three tables that make up this relationship. That is, sys_user_group, sys_user_grmember, and sys_user.   I followed the documentation on how to do a join and came up with the below code. The problem is that it's pulling all the users when I only have 2 assigned in this group.   Any help is appreciated. Thank you.

Todd

var gr = new GlideRecord('sys_user');

grSUGM = gr.addJoinQuery('sys_user_grmember'); // <-- join to the association table

grSUG = grSUGM.addJoinQuery('sys_user_group'); // <-- join to the sys_user_group that holds the group name

grSUG.addCondition('name', 'Todd Group'); // <-- filter on the sys_user_group table by the group name

gr.query();

while (gr.next()) {

  gs.info('Here is a user: ' + gr.name + ', ' + gr.sys_id); // <-- Print all users, more than just the 2 I have in "Todd Group."

}

1 ACCEPTED SOLUTION

Pradeep Sharma
ServiceNow Employee
ServiceNow Employee

Hi Todd,



Here you go.


var gr = new GlideRecord('sys_user_grmember');  


// <-- join to the association table  


// <-- join to the sys_user_group that holds the group name  


gr.addQuery('group.name', 'Todd Group'); // <-- filter on the sys_user_group table by the group name  


gr.query();  


while (gr.next()) {  


  gs.info('Here is a user: ' + gr.user.getDisplayValue()); // <-- Print all users, more than just the 2 I have in "Todd Group."  


}  


View solution in original post

6 REPLIES 6

Brian Dailey1
Kilo Sage

Hi Todd,



Actually, all you need to do is query the many-to-many table that relates users to groups, [sys_user_grmember].



var gr = new GlideRecord('sys_user_grmember');


gr.addQuery('group=(insert sys_id of Todd Group));


gr.query();


var users = '';


while(gr.next()){


          users += gr.user.name + ",";


}


gs.log("Users found in Todd Group: " + users);



As an example, this will generate a comma-separated list of the user name's, but you could pull whatever info you wanted (sys_id, etc.).




Give that a try.



-Brian




Edited: to follow your sample code closed using 'name'.


Hi Brian,


I ran the above query but I'm still getting all the user records from the entire sys_user table. I see the Pradeep's suggestion below is working. Thank you for taking the time and I'm sure a little tweaking and this one would work too.


Todd


It's probably the addQuery() statement (once you insert your group's sys_id)...   I didn't have the closing quote on the query string.   An invalid query string will return all records unless you specify otherwise.




-Brian


Pradeep Sharma
ServiceNow Employee
ServiceNow Employee

Hi Todd,



Here you go.


var gr = new GlideRecord('sys_user_grmember');  


// <-- join to the association table  


// <-- join to the sys_user_group that holds the group name  


gr.addQuery('group.name', 'Todd Group'); // <-- filter on the sys_user_group table by the group name  


gr.query();  


while (gr.next()) {  


  gs.info('Here is a user: ' + gr.user.getDisplayValue()); // <-- Print all users, more than just the 2 I have in "Todd Group."  


}