You can use below custom service to get the list of specific Group Members:
Input: UserGroup //string--"A valid UserGroup name",like Administrators
Output: Group_Member //InfoTable with fiels name, description and type
//Declare our recursion depth cap to ensure that the loop will exit at some point incase an error in ThingWorx allows
//for a circular group reference
var recursionLevel = 0;
var recursionLevelCap = 20;
//Determine if the UserGroup variable is actually a user group
if(!Groups[UserGroup])
{
logger.error("Service call " + me.name + "::GetAllUsersInGroup() was supplied invalid UserGroup name, service commencing exit.");
}
else //If our UserGroup input is valid, continue with service
{
//Recursive function call
var groupMembers = buildMemberInfotable(0, UserGroup);
// Return all group members after removing duplicates and sorting by name
//Build params to remove duplicate entries
var params = {
t: groupMembers /* INFOTABLE */,
columns: "name,description,type" /* STRING */
};
//Remove duplicate entries
var result = Resources["InfoTableFunctions"].Distinct(params);
//Build sort params
var params = {
sortColumn: "name" /* STRING */,
t: result /* INFOTABLE */,
ascending: true /* BOOLEAN */
};
//Sort by user name
var result = Resources["InfoTableFunctions"].Sort(params);
}
//Recursive function to find all group members in a User Group structure
function buildMemberInfotable( recursionLevel, UserGroup )
{
var params = {
infoTableName : "InfoTable",
dataShapeName : "GroupMember"
};
// CreateInfoTableFromDataShape(infoTableName:STRING("InfoTable"), dataShapeName:STRING):INFOTABLE(GroupMember)
var finalMemberReturnTable = Resources["InfoTableFunctions"].CreateInfoTableFromDataShape(params);
//Only proceed if we haven't hit the recursion depth level cap
if(recursionLevel < recursionLevelCap)
{
//Increment the recursionLevel for the next pass
recursionLevel++;
// result: INFOTABLE dataShape: GroupMember
var groupAndMemberInfotable = Groups[UserGroup].GetGroupMembers();
var tableLength = groupAndMemberInfotable.rows.length;
//Loop through the members found, if they are a user, add them to the return table
//If not, use recursion and go deeper
for(var x = 0; x < tableLength; x++)
{
var row = groupAndMemberInfotable.rows[x];
if(row.type == "User")
{
finalMemberReturnTable.AddRow(row);
}
else
{
var recursiveTable = buildMemberInfotable( recursionLevel, row.name );
var params = {
t1: recursiveTable /* INFOTABLE */,
t2: finalMemberReturnTable /* INFOTABLE */
};
// result: INFOTABLE
finalMemberReturnTable = Resources["InfoTableFunctions"].Union(params);
}
}
//Return the members found at this level and deeper
return finalMemberReturnTable;
}
}