Compare commits

..

2 Commits

7 changed files with 302 additions and 41 deletions

View File

@@ -24231,6 +24231,39 @@ GO
==========================================================================================================
*/
-- C2025-009 Report for tracking PROMS Users / Security
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[getUserAcessControl]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1)
DROP PROCEDURE [getUserAcessControl];
GO
/****** Object: StoredProcedure [dbo].[getUserAcessControl] Script Date: 9/5/2025 6:51:42 AM ******/
-- =============================================
-- Author: Matthew Schill
-- Create date: 09/05/2025
-- Description: Get Data on When Users were added to PROMS and when they were added to Security Groups
-- =============================================
CREATE PROCEDURE [dbo].[getUserAcessControl]
AS
BEGIN
SELECT Users.UserID,
WhenUserAddedToPROMS = Users.[DTS],
GroupName = Groups.GroupName,
WhenUserAddedToGroup = Memberships.[DTS],
WhoAddedUserToGroup = CASE WHEN
Memberships.UsrID = Users.UsrID
AND Users.UsrID = Users.UserID
THEN 'INITIAL_SETUP'
ELSE Memberships.UsrID END,
DateUserRemovedFromGroup = Memberships.EndDate
FROM Memberships
inner join Groups on Memberships.GID = Groups.GID
right outer join Users on Users.UID = Memberships.UID
order by UserID, Memberships.[DTS]
RETURN
END
/*
---------------------------------------------------------------------------
| ADD New Code Before this Block |
@@ -24264,8 +24297,8 @@ BEGIN TRY -- Try Block
DECLARE @RevDate varchar(255)
DECLARE @RevDescription varchar(255)
set @RevDate = '09/04/2025 7:00 AM'
set @RevDescription = 'Removed stored procedures no longer needed'
set @RevDate = '09/05/2025 7:00 AM'
set @RevDescription = 'Added stored procedure for User Access Control Report'
Select cast(@RevDate as datetime) RevDate, @RevDescription RevDescription
PRINT 'SQL Code Revision ' + @RevDate + ' - ' + @RevDescription

View File

@@ -121,6 +121,10 @@
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\3rdPartyLibraries\Log4Net\log4net.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, processorArchitecture=MSIL">
<EmbedInteropTypes>True</EmbedInteropTypes>
</Reference>
<Reference Include="System" />
<Reference Include="System.configuration" />
<Reference Include="System.Data">

View File

@@ -9,6 +9,8 @@ using Volian.Controls.Library;
using DevComponents.DotNetBar;
using JR.Utils.GUI.Forms;
using System.Linq;
using System.Data;
using xls = Microsoft.Office.Interop.Excel;
namespace VEPROMS
{
@@ -275,6 +277,13 @@ namespace VEPROMS
setupProgessSteps1();
}
//C2025-009 Report for tracking PROMS Users / security
private void sideNavItmReports_Click(object sender, EventArgs e)
{
GenToolType = E_GenToolType.Reports;
setupProgessSteps1();
}
// C2017-030 new Tools user interface
private void sideNavItmExit_Click(object sender, EventArgs e)
{
@@ -287,7 +296,8 @@ namespace VEPROMS
private enum E_GenToolType : int
{
Check = 0,
Users = 3
Users = 3,
Reports = 5
};
private E_GenToolType GenToolType = 0;
@@ -314,8 +324,8 @@ namespace VEPROMS
progressSteps1.Visible = true;
progressSteps1.Refresh();
break;
case E_GenToolType.Users:
case E_GenToolType.Reports:
splitContainer3.Panel2Collapsed = true;
progressSteps1.Visible = false;
break;
@@ -415,7 +425,133 @@ namespace VEPROMS
ClearStepProgress();
}
//C2025-009 Report for tracking PROMS Users / security
//UACfilename will hold the filename for cases when scheduled for later
private string UACfilename;
//C2025-009 Report for tracking PROMS Users / security
private void btnUAC_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(UACfilename))
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "Excel XLS (*.xlsx)|*.xlsx";
sfd.FileName = "UACReport.xlsx";
if (sfd.ShowDialog() == DialogResult.OK)
{
UACfilename = sfd.FileName;
}
}
if (!CheckProcessLater()) return; // delay processing if set//B2017-221 Allow the batch dialog to close when waiting to process.
txtProcess.Clear();
txtResults.Clear();
if (!string.IsNullOrEmpty(UACfilename))
{
Generate_UAC_Report(UACfilename);
}
UACfilename = null;
}
//C2025-009 Report for tracking PROMS Users / security
//Get Datatable of results then loop through outputting into excel
private void Generate_UAC_Report(string filename)
{
this.Cursor = Cursors.WaitCursor;
DateTime pStart = DateTime.Now;
txtProcess.AppendText("Generate User Access Control Report in PROMS");
txtProcess.AppendText(Environment.NewLine);
txtProcess.AppendText(string.Format("Started: {0}", pStart.ToString("MM/dd/yyyy @ HH:mm")));
txtProcess.AppendText(Environment.NewLine);
Application.DoEvents();
txtResults.Clear();
txtResults.AppendText("Generating User Access Control Report");
using (DataTable dt = UserReports.GetUserAccessControlData())
{
// Start Excel and get Application object.
xls.Application excel = new xls.Application
{
// Make Excel invisible and disable alerts.
Visible = false,
DisplayAlerts = false
};
// Create a new Workbook.
xls.Workbook excelworkBook = excel.Workbooks.Add();
// Create a Worksheet.
var workSheet = (xls.Worksheet)excelworkBook.ActiveSheet;
workSheet.Name = "UAC Report";
// column headings
for (var i = 0; i < dt.Columns.Count; i++)
{
workSheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;
}
// rows
for (var i = 0; i < dt.Rows.Count; i++)
{
for (var j = 0; j < dt.Columns.Count; j++)
{
workSheet.Cells[i + 2, j + 1] = dt.Rows[i][j];
}
}
//resize the columns to match the data
workSheet.Columns.AutoFit();
//freeze the top row, and highlight those cells
workSheet.Application.ActiveWindow.SplitRow = 1;
workSheet.Application.ActiveWindow.FreezePanes = true;
workSheet.Cells.Range[workSheet.Cells[1, 1], workSheet.Cells[1, dt.Columns.Count]].Interior.Color = xls.XlRgbColor.rgbLightBlue;
//save the excel file
excelworkBook.SaveAs(filename);
excelworkBook.Close();
excel.Quit();
//release any in use com objects
releaseObject(workSheet);
releaseObject(excelworkBook);
releaseObject(excel);
}
DateTime pEnd = DateTime.Now;
txtProcess.AppendText(string.Format("Completed: {0}", pEnd.ToString("MM/dd/yyyy @ HH:mm")));
Application.DoEvents();
this.Cursor = Cursors.Default;
MessageBox.Show("Generate User Access Control Report Completed", "User Access Control Report");
}
//C2025-009 Report for tracking PROMS Users / security
//for releasing any Excel com objects still in memory
private void releaseObject(object obj)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
obj = null;
}
catch (Exception ex)
{
obj = null;
MessageBox.Show("Exception Occurred while releasing object " + ex.ToString());
}
finally
{
GC.Collect();
}
}
//C2025-011 RO Update Tool Memory Enhancements
private void txtProcess_TextChanged(object sender, EventArgs e)
{

View File

@@ -51,6 +51,9 @@
this.expandableSplitter1 = new DevComponents.DotNetBar.ExpandableSplitter();
this.panelEx1 = new DevComponents.DotNetBar.PanelEx();
this.sideNav1 = new DevComponents.DotNetBar.Controls.SideNav();
this.sideNavPanel6 = new DevComponents.DotNetBar.Controls.SideNavPanel();
this.sideNavPanel5 = new DevComponents.DotNetBar.Controls.SideNavPanel();
this.btn_ShowUsers = new DevComponents.DotNetBar.ButtonX();
this.sideNavPanel1 = new DevComponents.DotNetBar.Controls.SideNavPanel();
this.warningBox3 = new DevComponents.DotNetBar.Controls.WarningBox();
this.labelX7 = new DevComponents.DotNetBar.LabelX();
@@ -62,12 +65,11 @@
this.swCkOrphanDataRecs = new DevComponents.DotNetBar.Controls.SwitchButton();
this.labelX1 = new DevComponents.DotNetBar.LabelX();
this.btnRunCheck = new DevComponents.DotNetBar.ButtonX();
this.sideNavPanel5 = new DevComponents.DotNetBar.Controls.SideNavPanel();
this.btn_ShowUsers = new DevComponents.DotNetBar.ButtonX();
this.sideNavItem1 = new DevComponents.DotNetBar.Controls.SideNavItem();
this.separator1 = new DevComponents.DotNetBar.Separator();
this.sideNavItmCheck = new DevComponents.DotNetBar.Controls.SideNavItem();
this.sideNavItmUsers = new DevComponents.DotNetBar.Controls.SideNavItem();
this.sideNavItmReports = new DevComponents.DotNetBar.Controls.SideNavItem();
this.sideNavItmExit = new DevComponents.DotNetBar.Controls.SideNavItem();
this.panelEx4 = new DevComponents.DotNetBar.PanelEx();
this.progressSteps1 = new DevComponents.DotNetBar.ProgressSteps();
@@ -78,6 +80,7 @@
this.lblAdmToolProgressType = new DevComponents.DotNetBar.LabelX();
this.buttonItem1 = new DevComponents.DotNetBar.ButtonItem();
this.superTooltip1 = new DevComponents.DotNetBar.SuperTooltip();
this.btnUAC = new DevComponents.DotNetBar.ButtonX();
((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).BeginInit();
this.splitContainer3.Panel1.SuspendLayout();
this.splitContainer3.Panel2.SuspendLayout();
@@ -89,8 +92,9 @@
this.pnlLater.SuspendLayout();
this.panelEx1.SuspendLayout();
this.sideNav1.SuspendLayout();
this.sideNavPanel1.SuspendLayout();
this.sideNavPanel6.SuspendLayout();
this.sideNavPanel5.SuspendLayout();
this.sideNavPanel1.SuspendLayout();
this.panelEx4.SuspendLayout();
this.SuspendLayout();
//
@@ -416,8 +420,9 @@
// sideNav1
//
this.sideNav1.BackColor = System.Drawing.SystemColors.Control;
this.sideNav1.Controls.Add(this.sideNavPanel1);
this.sideNav1.Controls.Add(this.sideNavPanel6);
this.sideNav1.Controls.Add(this.sideNavPanel5);
this.sideNav1.Controls.Add(this.sideNavPanel1);
this.sideNav1.Dock = System.Windows.Forms.DockStyle.Fill;
this.sideNav1.EnableClose = false;
this.sideNav1.EnableMaximize = false;
@@ -426,6 +431,7 @@
this.separator1,
this.sideNavItmCheck,
this.sideNavItmUsers,
this.sideNavItmReports,
this.sideNavItmExit});
this.sideNav1.Location = new System.Drawing.Point(0, 0);
this.sideNav1.Name = "sideNav1";
@@ -434,6 +440,40 @@
this.sideNav1.TabIndex = 3;
this.sideNav1.Text = "sideNav1";
//
// sideNavPanel6
//
this.sideNavPanel6.Controls.Add(this.btnUAC);
this.sideNavPanel6.Dock = System.Windows.Forms.DockStyle.Fill;
this.sideNavPanel6.Location = new System.Drawing.Point(88, 31);
this.sideNavPanel6.Name = "sideNavPanel6";
this.sideNavPanel6.Size = new System.Drawing.Size(292, 493);
this.sideNavPanel6.TabIndex = 14;
//
// sideNavPanel5
//
this.sideNavPanel5.Controls.Add(this.btn_ShowUsers);
this.sideNavPanel5.Dock = System.Windows.Forms.DockStyle.Fill;
this.sideNavPanel5.Location = new System.Drawing.Point(88, 31);
this.sideNavPanel5.Name = "sideNavPanel5";
this.sideNavPanel5.Size = new System.Drawing.Size(292, 493);
this.sideNavPanel5.TabIndex = 14;
this.sideNavPanel5.Visible = false;
//
// btn_ShowUsers
//
this.btn_ShowUsers.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.btn_ShowUsers.Checked = true;
this.btn_ShowUsers.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground;
this.btn_ShowUsers.Location = new System.Drawing.Point(57, 37);
this.btn_ShowUsers.Name = "btn_ShowUsers";
this.btn_ShowUsers.Size = new System.Drawing.Size(171, 23);
this.btn_ShowUsers.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.superTooltip1.SetSuperTooltip(this.btn_ShowUsers, new DevComponents.DotNetBar.SuperTooltipInfo("Show Users", "", "This will return all of the users currently with open sessions in the database an" +
"d the details of any items they have checked out.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(200, 80)));
this.btn_ShowUsers.TabIndex = 0;
this.btn_ShowUsers.Text = "Show Users";
this.btn_ShowUsers.Click += new System.EventHandler(this.btn_ShowUsers_Click);
//
// sideNavPanel1
//
this.sideNavPanel1.Controls.Add(this.warningBox3);
@@ -451,6 +491,7 @@
this.sideNavPanel1.Name = "sideNavPanel1";
this.sideNavPanel1.Size = new System.Drawing.Size(292, 493);
this.sideNavPanel1.TabIndex = 2;
this.sideNavPanel1.Visible = false;
//
// warningBox3
//
@@ -600,31 +641,6 @@
this.btnRunCheck.Text = "Run Check";
this.btnRunCheck.Click += new System.EventHandler(this.btnRunCheck_Click);
//
// sideNavPanel5
//
this.sideNavPanel5.Controls.Add(this.btn_ShowUsers);
this.sideNavPanel5.Dock = System.Windows.Forms.DockStyle.Fill;
this.sideNavPanel5.Location = new System.Drawing.Point(88, 31);
this.sideNavPanel5.Name = "sideNavPanel5";
this.sideNavPanel5.Size = new System.Drawing.Size(292, 493);
this.sideNavPanel5.TabIndex = 14;
this.sideNavPanel5.Visible = false;
//
// btn_ShowUsers
//
this.btn_ShowUsers.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.btn_ShowUsers.Checked = true;
this.btn_ShowUsers.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground;
this.btn_ShowUsers.Location = new System.Drawing.Point(57, 37);
this.btn_ShowUsers.Name = "btn_ShowUsers";
this.btn_ShowUsers.Size = new System.Drawing.Size(171, 23);
this.btn_ShowUsers.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.superTooltip1.SetSuperTooltip(this.btn_ShowUsers, new DevComponents.DotNetBar.SuperTooltipInfo("Show Users", "", "This will return all of the users currently with open sessions in the database an" +
"d the details of any items they have checked out.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray, true, true, new System.Drawing.Size(200, 80)));
this.btn_ShowUsers.TabIndex = 0;
this.btn_ShowUsers.Text = "Show Users";
this.btn_ShowUsers.Click += new System.EventHandler(this.btn_ShowUsers_Click);
//
// sideNavItem1
//
this.sideNavItem1.IsSystemMenu = true;
@@ -644,7 +660,6 @@
//
// sideNavItmCheck
//
this.sideNavItmCheck.Checked = true;
this.sideNavItmCheck.Name = "sideNavItmCheck";
this.sideNavItmCheck.Panel = this.sideNavPanel1;
this.sideNavItmCheck.Symbol = "";
@@ -659,6 +674,15 @@
this.sideNavItmUsers.Text = "Users";
this.sideNavItmUsers.Click += new System.EventHandler(this.sideNavItmUsers_Click);
//
// sideNavItmReports
//
this.sideNavItmReports.Checked = true;
this.sideNavItmReports.Name = "sideNavItmReports";
this.sideNavItmReports.Panel = this.sideNavPanel6;
this.sideNavItmReports.Symbol = "";
this.sideNavItmReports.Text = "Reports";
this.sideNavItmReports.Click += new System.EventHandler(this.sideNavItmReports_Click);
//
// sideNavItmExit
//
this.sideNavItmExit.Name = "sideNavItmExit";
@@ -761,6 +785,20 @@
this.superTooltip1.DefaultTooltipSettings = new DevComponents.DotNetBar.SuperTooltipInfo("", "", "", null, null, DevComponents.DotNetBar.eTooltipColor.Gray);
this.superTooltip1.LicenseKey = "F962CEC7-CD8F-4911-A9E9-CAB39962FC1F";
//
// btnUAC
//
this.btnUAC.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.btnUAC.Checked = true;
this.btnUAC.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground;
this.btnUAC.Location = new System.Drawing.Point(35, 30);
this.btnUAC.Name = "btnUAC";
this.btnUAC.Size = new System.Drawing.Size(187, 23);
this.btnUAC.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.btnUAC.TabIndex = 0;
this.btnUAC.Text = "Run User Access Control Report";
this.superTooltip1.SetSuperTooltip(this.btnUAC, new DevComponents.DotNetBar.SuperTooltipInfo("UAC Report", "", "This will return a report containing info on when users were added to PROMS and when users were added to specific PROMS security groups.", null, null, DevComponents.DotNetBar.eTooltipColor.Gray));
this.btnUAC.Click += new System.EventHandler(this.btnUAC_Click);
//
// frmGenTools
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -790,15 +828,16 @@
this.panelEx1.ResumeLayout(false);
this.sideNav1.ResumeLayout(false);
this.sideNav1.PerformLayout();
this.sideNavPanel1.ResumeLayout(false);
this.sideNavPanel6.ResumeLayout(false);
this.sideNavPanel5.ResumeLayout(false);
this.sideNavPanel1.ResumeLayout(false);
this.panelEx4.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.SplitContainer splitContainer3;
#endregion
private System.Windows.Forms.SplitContainer splitContainer3;
private DevComponents.DotNetBar.PanelEx panelEx3;
private System.Windows.Forms.TextBox txtResults;
private System.Windows.Forms.Panel panel1;
@@ -829,11 +868,13 @@
private DevComponents.DotNetBar.ButtonX btnRunCheck;
private DevComponents.DotNetBar.Controls.SideNavPanel sideNavPanel5;
private DevComponents.DotNetBar.ButtonX btn_ShowUsers;
private DevComponents.DotNetBar.Controls.SideNavItem sideNavItem1;
private DevComponents.DotNetBar.Controls.SideNavPanel sideNavPanel6;
private DevComponents.DotNetBar.Controls.SideNavItem sideNavItem1;
private DevComponents.DotNetBar.Separator separator1;
private DevComponents.DotNetBar.Controls.SideNavItem sideNavItmCheck;
private DevComponents.DotNetBar.Controls.SideNavItem sideNavItmUsers;
private DevComponents.DotNetBar.Controls.SideNavItem sideNavItmExit;
private DevComponents.DotNetBar.Controls.SideNavItem sideNavItmReports;
private DevComponents.DotNetBar.Controls.SideNavItem sideNavItmExit;
private DevComponents.DotNetBar.LabelX lblAdmToolProgressType;
private DevComponents.DotNetBar.ProgressSteps progressSteps1;
private DevComponents.DotNetBar.StepItem stepItem1;
@@ -847,7 +888,8 @@
private DevComponents.DotNetBar.PanelEx panelEx4;
private DevComponents.DotNetBar.Controls.WarningBox warningBox3;
private DevComponents.DotNetBar.ButtonItem buttonItem1;
}
private DevComponents.DotNetBar.ButtonX btnUAC;
}
}

View File

@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="superTooltip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="warningBox3.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>

View File

@@ -0,0 +1,42 @@
using System;
using Csla.Data;
using System.Data;
using System.Data.SqlClient;
//CSM - C2025-009 - Minimal Class for User based Reports
namespace VEPROMS.CSLA.Library
{
public static class UserReports
{
#region Get User Reports
//CSM - C2025-009 Report for tracking PROMS Users / security
public static DataTable GetUserAccessControlData()
{
try
{
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "getUserAcessControl";
cm.CommandTimeout = Database.DefaultTimeout;
using (SqlDataAdapter da = new SqlDataAdapter(cm))
{
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
}
}
}
catch (Exception ex)
{
throw new DbCslaException("Error in getUserAcessControl Report: retrieving data failed", ex);
}
}
#endregion
}
}

View File

@@ -388,6 +388,7 @@
<Compile Include="Generated\ZTransition.cs" />
<Compile Include="Generated\ZTransitionInfo.cs" />
<Compile Include="Minimal\AnnotationstypeSections.cs" />
<Compile Include="Minimal\UserReports.cs" />
<Compile Include="Minimal\UserSettings.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="VEObjects\VEDrillDown.cs" />