diff --git a/source/Public/Merge-CISExcelAndCsvData.ps1 b/source/Public/Merge-CISExcelAndCsvData.ps1 new file mode 100644 index 0000000..b63eacf --- /dev/null +++ b/source/Public/Merge-CISExcelAndCsvData.ps1 @@ -0,0 +1,47 @@ +function Merge-CISExcelAndCsvData { + [CmdletBinding()] + param ( + [Parameter(Mandatory = $true)] + [string]$ExcelPath, + + [Parameter(Mandatory = $true)] + [string]$WorksheetName, + + [Parameter(Mandatory = $true)] + [string]$CsvPath + ) + + process { + # Import data from Excel and CSV + $import = Import-Excel -Path $ExcelPath -WorksheetName $WorksheetName + $csvData = Import-Csv -Path $CsvPath + + # Define a function to create a merged object + function CreateMergedObject($excelItem, $csvRow) { + $newObject = New-Object PSObject + + foreach ($property in $excelItem.PSObject.Properties) { + $newObject | Add-Member -MemberType NoteProperty -Name $property.Name -Value $property.Value + } + + $newObject | Add-Member -MemberType NoteProperty -Name 'CSV_Status' -Value $csvRow.Status + $newObject | Add-Member -MemberType NoteProperty -Name 'CSV_Details' -Value $csvRow.Details + $newObject | Add-Member -MemberType NoteProperty -Name 'CSV_FailureReason' -Value $csvRow.FailureReason + + return $newObject + } + + # Iterate over each item in the imported Excel object and merge with CSV data + $mergedData = foreach ($item in $import) { + $csvRow = $csvData | Where-Object { $_.Rec -eq $item.'recommendation #' } + if ($csvRow) { + CreateMergedObject -excelItem $item -csvRow $csvRow + } else { + CreateMergedObject -excelItem $item -csvRow ([PSCustomObject]@{Status=$null; Details=$null; FailureReason=$null}) + } + } + + # Return the merged data + return $mergedData + } +} diff --git a/source/Public/Update-CISExcelWorksheet.ps1 b/source/Public/Update-CISExcelWorksheet.ps1 new file mode 100644 index 0000000..712a89b --- /dev/null +++ b/source/Public/Update-CISExcelWorksheet.ps1 @@ -0,0 +1,62 @@ +function Update-CISExcelWorksheet { + [CmdletBinding()] + param ( + [Parameter(Mandatory = $true)] + [string]$ExcelPath, + + [Parameter(Mandatory = $true)] + [string]$WorksheetName, + + [Parameter(Mandatory = $true)] + [psobject[]]$Data, + + [Parameter(Mandatory = $false)] + [int]$StartingRowIndex = 2 # Default starting row index, assuming row 1 has headers + ) + + process { + # Load the existing Excel sheet + $excelPackage = Open-ExcelPackage -Path $ExcelPath + $worksheet = $excelPackage.Workbook.Worksheets[$WorksheetName] + + if (-not $worksheet) { + throw "Worksheet '$WorksheetName' not found in '$ExcelPath'" + } + + # Function to update cells in the worksheet + function Update-WorksheetCells { + param ( + $Worksheet, + $Data, + $StartingRowIndex + ) + + # Check and set headers + $firstItem = $Data[0] + $colIndex = 1 + foreach ($property in $firstItem.PSObject.Properties) { + if ($StartingRowIndex -eq 2 -and $Worksheet.Cells[1, $colIndex].Value -eq $null) { + $Worksheet.Cells[1, $colIndex].Value = $property.Name + } + $colIndex++ + } + + # Iterate over each row in the data and update cells + $rowIndex = $StartingRowIndex + foreach ($item in $Data) { + $colIndex = 1 + foreach ($property in $item.PSObject.Properties) { + $Worksheet.Cells[$rowIndex, $colIndex].Value = $property.Value + $colIndex++ + } + $rowIndex++ + } + } + + # Update the worksheet with the provided data + Update-WorksheetCells -Worksheet $worksheet -Data $Data -StartingRowIndex $StartingRowIndex + + # Save and close the Excel package + Close-ExcelPackage $excelPackage + } +} \ No newline at end of file diff --git a/source/tests/Test-AdministrativeAccountCompliance .ps1 b/source/tests/Test-AdministrativeAccountCompliance .ps1 index 9841865..597936a 100644 --- a/source/tests/Test-AdministrativeAccountCompliance .ps1 +++ b/source/tests/Test-AdministrativeAccountCompliance .ps1 @@ -1,16 +1,14 @@ function Test-AdministrativeAccountCompliance { [CmdletBinding()] param ( - [switch]$SkipGraphConnection + # Parameters can be added if needed ) begin { #. C:\Temp\CISAuditResult.ps1 $validLicenses = @('AAD_PREMIUM', 'AAD_PREMIUM_P2') } process { - if (-not $SkipGraphConnection) { - Connect-MgGraph -Scopes "Directory.Read.All", "User.Read.All", "RoleManagement.Read.Directory" -NoWelcome - } + $adminRoles = Get-MgRoleManagementDirectoryRoleDefinition | Where-Object { $_.DisplayName -like "*Admin*" } $adminRoleUsers = @() foreach ($role in $adminRoles) {