Psurendra
(Surendra P)
June 30, 2026, 4:40pm
1
Hi everyone,
I’m looking for ideas on the best approach to generate a custom IdentityIQ report that includes both identity and application account details.
The report should include:
Employee ID
Employee Name
Manager
Job Title
Location
Roles
Application Name
Account Status (Active/Disabled)
Has anyone implemented a similar report? I’d appreciate any recommendations, best practices, or sample approaches.
Thank you!
Puja_IAM
(Puja Kumari)
June 30, 2026, 4:58pm
2
Hello @Psurendra ,
Please follow the below documentation for developing custom IdentityIQ reports.
neel193
(Neelmadhav Panda)
June 30, 2026, 6:07pm
3
Chathuryas
(Chathurya Simhadri)
July 1, 2026, 5:00am
4
Hi @Psurendra ,
You can create a custom report using ObjectType as Identity and datasource type as Filter .
Chathuryas
(Chathurya Simhadri)
July 1, 2026, 6:07am
6
Hi @Psurendra ,
You can use the below custom report to get the identity details and make modifications in the attributes or add a form to get specific identity details.
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE TaskDefinition PUBLIC "sailpoint.dtd" "sailpoint.dtd">
<TaskDefinition executor="sailpoint.reporting.LiveReportExecutor" name="Custom Get Identity Details Report " subType="task_item_type_live_report" template="true" type="LiveReport">
<Attributes>
<Map>
<entry key="TaskDefinition.runLengthAverage" value="5"/>
<entry key="TaskDefinition.runLengthTotal" value="11"/>
<entry key="TaskDefinition.runs" value="2"/>
<entry key="report">
<value>
<LiveReport title="Identity Details Report">
<DataSource objectType="sailpoint.object.Identity" type="Filter"/>
<Columns>
<ReportColumnConfig field="userEmployeeId" header="EmployeedID" property="employeeID" width="110"/>
<ReportColumnConfig field="userName" header="name" property="name" width="110"/>
<ReportColumnConfig field="userFirstName" header="FirstName" property="firstname" width="110"/>
<ReportColumnConfig field="userLastName" header="LastName" property="lastname" width="110"/>
<ReportColumnConfig field="userManager" header="Manager" property="manager.name" width="110"/>
<ReportColumnConfig field="userDesignation" header="Designation" property="designation" width="110"/>
<ReportColumnConfig field="assignedRoles" header="Business Roles" property="assignedRoleSummary" width="110"/>
<ReportColumnConfig field="detectedRoles" header="IT Roles" property="bundleSummary" width="110"/>
<ReportColumnConfig field="appAccountStatus" header="Application Account Status" property="name" width="110">
<RenderScript>
<Source>
import org.apache.log4j.Logger;
import sailpoint.object.Link;
import sailpoint.object.Identity;
import java.util.Map;
import java.util.HashMap;
Map map = new HashMap();
Logger log = Logger.getLogger("com.example.customLogs");
log.error("Value : " + value);
if(value!=null){
Identity identity = context.getObjectByName(Identity.class,value);
if(identity!=null){
List links = identity.getLinks();
if(links!=null && !links.isEmpty()){
for(Link link : links){
if(link!=null){
String applicationName = link.getApplicationName();
boolean isDisabled = link.getIiqDisabled();
if(isDisabled){
map.put(applicationName,"Disabled");
}else{
map.put(applicationName,"Active");
}
}
}
}
}
}
return map;
</Source>
</RenderScript>
</ReportColumnConfig>
</Columns>
</LiveReport>
</value>
</entry>
</Map>
</Attributes>
</TaskDefinition>
Please check below report based on the attributes that you are looking for:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE TaskDefinition PUBLIC "sailpoint.dtd" "sailpoint.dtd">
<TaskDefinition created="1782886928015" executor="sailpoint.reporting.LiveReportExecutor" id="644006589f1c1b4f819f1c578e8f0032" modified="1782887277107" name="Identity Application Account Details Report3" resultAction="Rename" significantModified="1782887277107" subType="Custom Reports" template="true" type="LiveReport">
<Attributes>
<Map>
<entry key="report">
<value>
<LiveReport title="Identity Application Account Details Report">
<DataSource objectType="sailpoint.object.Link" type="Filter"/>
<Columns>
<ReportColumnConfig field="employeeId" header="Employee ID" property="identity" width="110">
<RenderScript>
<Source>
if (value != null) {
Object empId = value.getAttribute("employeeID");
return empId != null ? empId.toString() : "";
}
return "";
</Source>
</RenderScript>
</ReportColumnConfig>
<ReportColumnConfig field="employeeName" header="Employee Name" property="identity.displayName" width="110"/>
<ReportColumnConfig field="manager" header="Manager" property="identity" width="110">
<RenderScript>
<Source>
if (value != null && value.getManager() != null) {
return value.getManager().getDisplayName();
}
return "";
</Source>
</RenderScript>
</ReportColumnConfig>
<ReportColumnConfig field="jobTitle" header="Job Title" property="identity" width="110">
<RenderScript>
<Source>
if (value != null) {
Object jobTitle = value.getAttribute("jobTitle");
return jobTitle != null ? jobTitle.toString() : "";
}
return "";
</Source>
</RenderScript>
</ReportColumnConfig>
<ReportColumnConfig field="location" header="Location" property="identity" width="110">
<RenderScript>
<Source>
if (value != null) {
Object location = value.getAttribute("location");
return location != null ? location.toString() : "";
}
return "";
</Source>
</RenderScript>
</ReportColumnConfig>
<ReportColumnConfig field="roles" header="Roles" property="identity" width="110">
<RenderScript>
<Source>
import java.util.ArrayList;
import java.util.List;
import sailpoint.object.Bundle;
import sailpoint.tools.Util;
List roles = new ArrayList();
if (value != null && value.getAssignedRoles() != null) {
for (Object roleObj : value.getAssignedRoles()) {
if (roleObj instanceof Bundle) {
roles.add(((Bundle) roleObj).getName());
} else if (roleObj != null) {
roles.add(roleObj.toString());
}
}
}
return Util.listToCsv(roles);
</Source>
</RenderScript>
</ReportColumnConfig>
<ReportColumnConfig field="applicationName" header="Application Name" property="application.name" width="110"/>
<ReportColumnConfig field="nativeIdentity" header="Native Identity" property="nativeIdentity" width="110"/>
<ReportColumnConfig field="accountStatus" header="Account Status" property="id" width="110">
<RenderScript>
<Source>
import sailpoint.object.Link;
if (value != null) {
Link link = context.getObjectById(Link.class, value.toString());
if (link != null && link.isDisabled()) {
return "Disabled";
}
}
return "Active";
</Source>
</RenderScript>
</ReportColumnConfig>
</Columns>
</LiveReport>
</value>
</entry>
</Map>
</Attributes>
<Description>
Shows one row per application account with Identity and Link details.
</Description>
<RequiredRights>
<Reference class="sailpoint.object.SPRight" id="644006589ca81ee6819ca87f22e80032" name="FullAccessReport"/>
</RequiredRights>
</TaskDefinition>
IS still issue persisting ?
@Psurendra
Is this use case is done? Let me know if the report I shared fixes the problem.
neel193
(Neelmadhav Panda)
July 2, 2026, 4:10pm
10
Technically this’ll work.. But keeping roles, and account status doesn’t make sense. Roles could have entitlements from multiple apps or may not be having any ent assigned… Showing it’s value against each app is more confusing.
@Psurendra Please don’t include Roles to your account status report. If you want to include only add roles specific to your app. But i would say keep a different report for Role Membership and use this for Account Status report.
Hi @Psurendra
If the report needs to include both identity attributes and application account details, I’d recommend using a LiveReport with a custom Java datasource. Since an Identity can have multiple Link objects, the datasource can iterate through each Link and return identity details along with the application name, native identity, and account status. For account status, avoid hardcoding a specific attribute because it varies by connector; use link.isDisabled() where applicable or read the connector-specific status attribute (for example, userAccountControl in AD). This approach is more flexible than an ObjectType/Filter datasource and makes it easier to add filters and extend the report in the future.