and more in a single search tool across platforms. Read the announcement here. |
04/18/2023 02:30 PM
Hi. I have an issue where after importing the ServiceNow accounts, the test users I have created are not being updated from "Manually Provisioned" to Active or Inactive. The accounts that already exist previously properly show as active or inactive...seems to just be the ones provisioned by Saviynt are not having their statuses updated properly. Any suggestions on where the issue might lie?
The configs looks correct below so I'm not sure what I'm missing here.
"statusConfig": {
"active": "true",
"inactive": "false"
},
"listField": "result",
"keyField": "accountID",
"colsToPropsMap": {
"customproperty1": "employee_number~#~char",
"CUSTOMPROPERTY2": "last_name~#~char",
"customproperty3": "name~#~char",
"CUSTOMPROPERTY4": "first_name~#~char",
"CUSTOMPROPERTY5": "department~#~char",
"CUSTOMPROPERTY6": "location~#~char",
"CUSTOMPROPERTY7": "email~#~char",
"CUSTOMPROPERTY8": "manager~#~char",
"CUSTOMPROPERTY9": "country~#~char",
"CUSTOMPROPERTY10": "phone~#~char",
"CUSTOMPROPERTY11": "title~#~char",
"name": "user_name~#~char",
"status": "active~#~char",
"accountID": "sys_id~#~char"
}
04/18/2023 02:38 PM
Hi
Are these test accounts part of account import? If yes what is the status of the account in the target.
Thanks
04/18/2023 02:41 PM
Yes, they look to be importing since the account entry on the user object is not showing as deleted or anything like that. The status in the target for the "active" attribute is true for all of the test users. So I would expect that upon aggregation of the accounts the status flag of the created test account should flip to active based on the config above, assuming "active" comes through with either "true" or "false" as a value.
04/18/2023 02:44 PM
04/18/2023 03:02 PM - edited 04/18/2023 03:04 PM
Please share full json. Fyi documentation json works very well please use same json
04/18/2023 03:05 PM - edited 04/18/2023 03:06 PM
I am using the OOTB json config listed below, I have removed the URL for sharing here but is correct.
{
"accountParams": {
"connection": "acctAuth",
"processingType": "SequentialAndIterative",
"call": {
"call1": {
"callOrder": 0,
"stageNumber": 0,
"http": {
"url": "https://URL.service-now.com/api/now/table/sys_user?sysparm_limit=100",
"httpHeaders": {
"Authorization": "${access_token}"
},
"httpContentType": "application/x-www-form-urlencoded",
"httpMethod": "GET"
},
"statusConfig": {
"active": "true",
"inactive": "false"
},
"listField": "result",
"keyField": "accountID",
"colsToPropsMap": {
"customproperty1": "employee_number~#~char",
"CUSTOMPROPERTY2": "last_name~#~char",
"customproperty3": "name~#~char",
"CUSTOMPROPERTY4": "first_name~#~char",
"CUSTOMPROPERTY5": "department~#~char",
"CUSTOMPROPERTY6": "location~#~char",
"CUSTOMPROPERTY7": "email~#~char",
"CUSTOMPROPERTY8": "manager~#~char",
"CUSTOMPROPERTY9": "country~#~char",
"CUSTOMPROPERTY10": "phone~#~char",
"CUSTOMPROPERTY11": "title~#~char",
"name": "user_name~#~char",
"status": "active~#~char",
"accountID": "sys_id~#~char"
},
"pagination": {
"nextUrl": {
"nextUrlPath": "${headers?.Link?.split(';')?.size()==5?headers?.Link?.split(';')[2]?.replace('rel=\"prev\",<', '')?.replace('>','')?.trim():headers?.Link?.split(';')?.size()==4 && headers?.Link?.split(';')[2].contains('rel=\"next\",<')?headers?.Link?.split(';')[1]?.replace('rel=\"first\",<', '')?.replace('>','')?.trim():null}"
}
}
}
}
},
"entitlementParams": {
"processingType": "SequentialAndIterative",
"entTypes": {
"Group": {
"entTypeOrder": 0,
"entTypeLabels": {},
"call": {
"call1": {
"connection": "acctAuth",
"callOrder": 0,
"stageNumber": 0,
"http": {
"httpHeaders": {
"Authorization": "${access_token}"
},
"url": "https://URL.service-now.com/api/now/table/sys_user_group",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"statusConfig": {
"active": "true",
"inactive": "false"
},
"listField": "result",
"keyField": "entitlementID",
"colsToPropsMap": {
"entitlementID": "sys_id~#~char",
"description": "description~#~char",
"entitlement_value": "name~#~char",
"displayname": "name~#~char",
"status": "active~#~char",
"updatedate": "sys_updated_on~#~char"
}
}
},
"entMappings": {
"Group": {
"listPath": "parent",
"idPath": "value",
"idColumn": "entitlementID",
"mappingTypes": [
"ENTMAP"
]
}
}
},
"Roles": {
"entTypeOrder": 1,
"entTypeLabels": {},
"call": {
"call1": {
"connection": "acctAuth",
"callOrder": 0,
"stageNumber": 0,
"http": {
"httpHeaders": {
"Authorization": "${access_token}"
},
"url": "https://URL.service-now.com/api/now/table/sys_user_role",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"listField": "result",
"keyField": "entitlementID",
"colsToPropsMap": {
"description": "description~#~char",
"customproperty3": "elevated_privilege~#~char",
"entitlementID": "sys_id~#~char",
"entitlement_Value": "name~#~char",
"displayname": "sys_name~#~char"
}
}
}
}
}
},
"acctEntParams": {
"entTypes": {
"Group": {
"call": {
"call1": {
"connection": "acctAuth",
"processingType": "http",
"http": {
"url": "https://URL.service-now.com/api/now/v1/table/sys_user_grmember?sysparm_limit=10000",
"httpContentType": "application/json",
"httpMethod": "GET",
"httpHeaders": {
"Authorization": "${access_token}"
}
},
"listField": "result",
"acctKeyField": "accountID",
"entKeyField": "entitlementID",
"acctIdPath": "user.value",
"entIdPath": "group.value",
"pagination": {
"nextUrl": {
"nextUrlPath": "${headers?.Link?.split(';')?.size()==5?headers?.Link?.split(';')[2]?.replace('rel=\"prev\",<', '')?.replace('>','')?.trim():headers?.Link?.split(';')?.size()==4 && headers?.Link?.split(';')[2].contains('rel=\"next\",<')?headers?.Link?.split(';')[1]?.replace('rel=\"first\",<', '')?.replace('>','')?.trim():null}"
}
}
}
}
},
"Roles": {
"call": {
"call1": {
"connection": "acctAuth",
"processingType": "http",
"http": {
"url": "https://URL.service-now.com/api/now/table/sys_user_has_role?sysparm_limit=10000",
"httpContentType": "application/json",
"httpMethod": "GET",
"httpHeaders": {
"Authorization": "${access_token}"
}
},
"listField": "result",
"acctKeyField": "accountID",
"entKeyField": "entitlementID",
"acctIdPath": "user.value",
"entIdPath": "role.value",
"pagination": {
"nextUrl": {
"nextUrlPath": "${headers?.Link?.split(';')?.size()==5?headers?.Link?.split(';')[2]?.replace('rel=\"prev\",<', '')?.replace('>','')?.trim():headers?.Link?.split(';')?.size()==4 && headers?.Link?.split(';')[2].contains('rel=\"next\",<')?headers?.Link?.split(';')[1]?.replace('rel=\"first\",<', '')?.replace('>','')?.trim():null}"
}
}
}
}
}
}
}
}
04/18/2023 07:46 PM - edited 04/18/2023 07:48 PM
Please add status threshold config
{
"statusAndThresholdConfig": {
"accountThresholdValue": 500,
"deleteLinks": false,
"correlateInactiveAccounts": true,
"inactivateAccountsNotInFile": false
}
}
04/19/2023 04:53 AM
Where in the config should this be added?
04/18/2023 02:57 PM
Config looks correct. Can you update some metadata of these test account in target and try to do recon in saviynt and see if the meta data is updated in Saviynt. If the metadata is updated successfully but status is still not then the issue would be in the status field. But this will help you to narrow down the issue.
Thanks
04/18/2023 03:08 PM
I will try this, should atleast tell me if the account is being updated in saviynt.