User License Auditing Using the .NET SDK Dell Stinnett, BOCP-BOE XIr2 Reporting Manager Ryla, Inc. [ SYLVIE GAUTHIER ASUG INSTALLATION MEMBER MEMBER SINCE: 1999 [ RAECHAL MARTIN ASUG INSTALLATION MEMBER MEMBER SINCE: 2004 [ CHARAN MARWAH ASUG INSTALLATION MEMBER MEMBER SINCE: 2003 ] [ Learning Points It is fairly simple to access user license and security information through the SAP BusinessObjects SDK query language. Data from multiple CMS queries can be combined to provide meaningful insight into user and security setup in SAP BusinessObjects. There are easy ways to use in-memory data sets as a data source for Crystal Reports Real Experience. Real Advantage. 2 [ Agenda 1. 2. 3. 4. 5. 6. 7. Introduction User Auditing Requirements In Memory Dataset Load Data View Data in Crystal Conclusion Q&A Real Experience. Real Advantage. 3 [ Introduction Ryla, Inc is a leading domestic provider of Customer Contact Solutions to Fortune 500 companies, government agencies and nonprofit organizations Atlanta Business Chronicle's #1 Fastest Growing Firm in 2009 On Inc. 5000’s Fastest Growing Private Companies list for four consecutive years, with a 2010 rank of 520. SAP BusinessObjects Edge 3.1 @240 total users 20 Named User licenses 20 Concurrent User Licenses @700 active reports Most reports delivered by e-mail InfoView login required for on-demand reports and some ondemand drill-down reports. Real Experience. Real Advantage. 4 [ Auditing Requirements Quarterly Audits User Audit Identify license type – Named or Concurrent Get the timestamp of most recent activity in InfoView Validate that all users are current Ryla Employees Group Audit Validate user groups against current project assignment Validate the reports to which each group has access Real Experience. Real Advantage. 5 [ Why Not Use the CMC or Query Builder? No hard-copy or historical views. No ability to see the “big picture” Can see all users assigned to a single group Can see all groups assigned to a single user Can see last logon for a single user Can’t combine it all into a single view of the data Real Experience. Real Advantage. 6 [ BOECommon Class Common functions for interacting with BusinessObjects CMS Login Translate Name to SI ID and vice versa Build InfoView path to a report Get all reports in a folder And much more! Reusable so that the same code doesn’t exist in multiple places It made the upgrade from XI r2 to XI 3.1 much less complicated. Real Experience. Real Advantage. 7 [ In Memory DataSet Four tables in an ADO.NET DataSet Real Experience. Real Advantage. 8 [ Load Data Data comes from two places CMS Audit Database Three types of reports By User By Group By Report User and Group data is always loaded Report data is only loaded if required Real Experience. Real Advantage. 9 [ Load Data Logic Real Experience. Real Advantage. 10 [ Get User Data from CMS string query = "Select SI_NAME, SI_USERFULLNAME, SI_ID, SI_NAMEDUSER, " + "SI_LASTLOGONTIME, SI_DESCRIPTION " + "From CI_SYSTEMOBJECTS " + "Where SI_KIND='User' and SI_NAME!='Administrator' " + "and SI_NAME!='Guest' " + "and SI_NAME!='PMUser' and SI_NAME!='QaaWSServletPrincipal' " + "Order by SI_NAME"; using (InfoObjects users = _common.BOEInfoStore.Query(query)) { for (int i = 1; i <= users.Count; i++) { using (User userData = (User)users[i]) { loadUserInfo(userData); } } } Real Experience. Real Advantage. 11 [ Get User Data from CMS (continued) private void loadUserInfo(User userData) { bool namedUser = (userData.Connection == CeConnectionType.ceConnectionNamed); AddUserRow(userData.Title, userData.FullName, namedUser, userData.Description); //get groups user is assigned to string query = "Select SI_ID, SI_USERGROUPS " + "from CI_SYSTEMOBJECTS where SI_ID=" + userData.ID.ToString(); using (InfoObjects userInfo = _common.BOEInfoStore.Query(query)) { if (userInfo.Count > 0) AddGroupRow(userInfo[1]); } } Real Experience. Real Advantage. 12 [ Get Last Activty Date From Audit Database Query based on “Last Login for All Users” report that comes with the Auditing package. string query = "SELECT DISTINCT AUDIT_EVENT.User_Name, " + "max(AUDIT_EVENT.Start_Timestamp) " + "FROM AUDIT_EVENT " + "WHERE AUDIT_EVENT.User_Name Is Not Null " + " AND AUDIT_EVENT.User_Name != 'Administrator' " + " AND ltrim(rtrim(AUDIT_EVENT.User_Name)) != '' " + "GROUP BY AUDIT_EVENT.User_Name ORDER BY AUDIT_EVENT.User_Name"; Real Experience. Real Advantage. 13 [ Get Report Info From CMS string query = "Select SI_ID, SI_NAME, SI_PARENTID, SI_KIND " + "From CI_INFOOBJECTS " + "Where SI_KIND in ('CrystalReport','Webi','Excel'," + "'PDF','Rtf','Txt','Universe','Word') " + " and SI_INSTANCE_OBJECT<1 " + "order by SI_NAME, SI_ID"; Real Experience. Real Advantage. 14 [ Get Report Info From CMS (continued) using (InfoObject rpt = rpts[i]) { dsAuditInfo.reportTable.AddreportTableRow(rpt.ID, rpt.Title, rpt.Kind, _common.GetPathFromFolderID(rpt.ParentID)); string role; using (SecurityInfo si = rpt.SecurityInfo) { for (int j = 1; j <= si.ObjectPrincipals.Count; j++) { if (si.ObjectPrincipals[j].Role != CeRole.ceRoleNoAccess) { switch (si.ObjectPrincipals[j].Role) { case CeRole.ceRoleAdvanced: role = "Advanced"; break; … Real Experience. Real Advantage. 15 [ Report Creation Select tables from Project Data\ADO.NET DataSets Seven reports User List Users with Groups Users with Reports Users by Group Reports by Group Groups by Report Users by Report Real Experience. Real Advantage. 16 [ Report Creation Real Experience. Real Advantage. 17 [ Report Viewer Single form with overloaded constructor Pass ADO.NET DataSet as a parameter to constructor Load report based on selections in GUI. Real Experience. Real Advantage. 18 [ Report Viewer – Overridden Constructor public BOEAuditRptViewer(DataSet dsAuditInfo, AuditRptType rptType) { InitializeComponent(); switch (rptType) { case AuditRptType.UserList: ConfigureUserListReport(dsAuditInfo); break; case AuditRptType.UserGroups: ConfigureUserGroupsRpt(dsAuditInfo); break; case AuditRptType.UserReports: ConfigureUserRptsRpt(dsAuditInfo); break; case … } } Real Experience. Real Advantage. 19 [ BOEUserAudit Application - Demo Real Experience. Real Advantage. 20 [ Best Practices If you’re going to be writing more than one utility, separate out “common” functions into their own assembly. Use a single report viewer form to display different reports by overriding the constructor. Real Experience. Real Advantage. 21 [ Key Learnings It is fairly simple to access user license and security information through the SAP BusinessObjects SDK query language. Data from multiple CMS queries can be combined to provide meaningful insight into user and security setup in SAP BusinessObjects. There are easy ways to use in-memory data sets as a data source for Crystal Reports Real Experience. Real Advantage. 22 [ Q&A Contact information: Dell Stinnett Email: dellstinnett@gmail.com Website: www.dellstinnett.com Real Experience. Real Advantage. 23 [ ] Thank you for participating. Please remember to complete and return your evaluation form following this session. For ongoing education on this area of focus, visit the Year-Round Community page at www.asug.com/yrc [ Real Experience. Real Advantage. SESSION CODE: 411 24