From ef55447e677aae31aa4eed9483206df8b1c67061 Mon Sep 17 00:00:00 2001 From: DrIOS <58635327+DrIOSX@users.noreply.github.com> Date: Sat, 8 Jun 2024 14:03:55 -0500 Subject: [PATCH] docs:update help --- README.md | Bin 14396 -> 17452 bytes docs/index.html | Bin 48876 -> 54652 bytes source/Private/Merge-CISExcelAndCsvData.ps1 | 23 +++++++++----- source/Public/Sync-CISExcelAndCsvData.ps1 | 33 +++++++++++++++----- 4 files changed, 42 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index b277981b2a0ddb1d971b0b2010ee1e0387b78004..f5830579b579c890d8f06319c13d1a86155469c6 100644 GIT binary patch literal 17452 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 delta 2583 zcmb_dPiUKE7=MB;%sOLfm!{2@_$FPOG)-er(2kj;OV+s#Myo9%ww1*-S-WOSNYX#^ zusj$NiDtZ-!4#b0q3=f_>_?cPGG{J&%Xwvt{UG7{Lp+d<8kr5 z#5??bxSt=!;vCB!=as}X|2+9p`}|`lit|O@4=a6-MLqo8t8RWYcD((3Z`|KL7bDg= ztz|<~3EYj}bEhQ6MPA4q<=YcUeg0FKdpz+r@21c5Z*EUxk#5orx3mHdO6r{lS7B^W-gdI?PtgDj=DJ>Iyzfvc~O8{29jQgI?2mhAx(i8Ayeqvpc}mT zRN$F5p_~uh`+;t&r0YhYbR3v#EPCKaiwf(GjEaW(+&^$l_* zbdBrTa0}(?VMKJ-*pa$Me-&|hN52jXRl3SwkB$u5i`>%IR4wG9{3I4@6ww~isk(18 zC&G}lj)D*A&@J5UT(!L8opfXeK^Yx=4N~#d;kgWZdG0i!FfZ6Og9-;b#IBO@{l3YU zD;ml+fE9EBZ4O}H6A(Y1I>Y;vq3%WtxOE1xs65v6kkrGdqozl0X(~)~KC>#4P4Z`duDPTF|{E z;1n&vX&Ga&$$Lp3&pf|??RY*CMvh{)j(!q8S72i;@B~gJB(O_iK9dPG!eqr*gudRg z6o%)6ds9Jr(5ppD0+h*)4byYfN0;?aPM6>hBaf@|BU6O5j4TvI8f|VZClQFHc%~5| zJ)w(^EZz2yP^3p1qSZCJkXa;4YmS*5oZp}>BR)IkJ!E?3r(fW|`lBaKIVRrXR8fi) z|CD+C-_+!d|F#n*t(vF0xIXszvrINl-rl7nK=a#WouY_@X#fjL^%6U Z{`1HF+t)rfi}J`Yds5qSc2DRQ`y1I}E6o4^ diff --git a/docs/index.html b/docs/index.html index 8cea2a9ff6ad08f8bdedfae44199fd11ac86a254..20f1530eee240fde10bcc40679aeb0333c3cfe43 100644 GIT binary patch delta 5602 zcmc&&TWr%+7(X2s0Ywlf7spJyE5mhTD-+nFq3nW_F$d$KY)jU4W7Mtf*2@MFtVE;e z5;2|^BckAg4<-`yZ-^lVh~dGgk!gH11`^-o0euGb_dBPjw{_!^xTR_T?YVsC`@Zvi zzwh_;=AFFTpUrvq_r)7Uo!B61)TjH4KmTozJtcGHE$7@#Eg~pJMMw;aei0E4;l(?G z?>-R|Vc{21aYT*AM4$TQ5C^e3EKk<2TJ9E4iCWC|D;a*Q56PXyB?;M&$TN*Kai0ia z=MdIJv2qyCu$F*vbDj?p1DFeA_K=bm!C9mDb~jymp)a-V!^#k}aNrb5;69$^lP`xB zmk(oA81Dc^qIicfTZuI-N+&P08^Z1}5s}A>?A;;g=fLUQJn8mL9C;FV^~F<{7O47{Z^I3ZlFL-+>!a*8@+;p{T>|5{*!kOQ=E{o;XMjMoZ)`J66x@ zhM-RQVw*GZZAni-xf&BLu^*yoW(&+VV+~0+ghfD}F5U9bVzEfzEkAB_-}OxAVwY$V ztx%koI|MD9^26T8p=a@IXe0kVuwq`d^1!tn`7`Ycb$ZP#p1yJp?|wEcAMLIvafni+ zT~yQ~n4>Dym@=J+v{F1dK3m!q_m|F;cGl_Ah4bXafgk0WV>Pb5VmFe5NJa!QNJhj8 zA`yuV#DhL0FjCpNeEbKSyxD%0TOaOA<+!|dEMLA?zoKATn9Y8gnq6L?q^cP5^6~ObA;>p)NxY>U8Zmw9 zn?^GSFpp5xtDp*~E`OGG`BCp`J1a*vhF4lQcAd0g`a7C1Fr5i3Ep)0MN3%HaQy~z( zuY+;K02DQRwxUS>ujV+@@DJzZG;7~koBU_*mo!TretoTn!0m(5^r*QTKBI{W!-~h+ z$%?jJ8RJ(oOsg2i>8Uj~dEt#`<<{&FXhO4efzNQkM( zOt1$Xd!_xq-mh9sDYg2=;k0XI3NcCpN^MPIl1X&`s&%z3lE3Y^l(^_(dBFYX5^@M~ z9aC;?u1r^3C)fCU*$7|B6TGR7(`&vW@Eb~ekdwx7~PmSl;9XeNCGn@Np= z5aGi?Z#m1Wvjr0Z4&s7%94X{swKkT7iL8T{^?aXx@WAAQ$%J^^AjD;(k>-|Efsw#W z(HP6D8NtnxyJ{90z)T-T2oc%VTg@+R%R>rnw)V9&=E;e^`SP8iF01Fwi#B<^VS_w3 zUTn42?6z&v6wL!Mnl$fL!YDMVDjYe}9;GfJFG-N4Yy8RlY4*zM6U*i3c;OZ*8&OJX z2*@lLG;<32Zhbz!BrndRb*`mbYw~Y0r=F5=(nBPF@TY#c@Z1g$5?sUT`pJrWRS#h* zLql9STN7wa^2sU#co{nFfuA%d=!KQ0aJax;xx%dG5k45gg5m;;AX}wpJoxQb4UI!= zgn}EOLJRikSPP1Hio5Gt)QaVd3UYa%oHu=v&XgGDS&yiqx!VX*ARQMKHt&b-^AV zK50W$B5XFA zQ4xk(Aym%UNMgKDtw~AE+>=Rn3KuBC2yyaMZ~j7VCi^OsXX~ot?QqrPKL@hCK;Ic$ zO=W}$K+@4nerLj3v%G93NHY`RD@Q`B?#`R#jrx1wXB>m}o@pd3Z?Uh ziu79kv^?Ed%YRaIbPdj6bS1K|Bdr6UPSc~XxCy+Ca1jPrxKNoRz-U56J1k^QGQ(5R zm}x74g6lQ7v_Z-qaU>3L{i&V}rj&5a%h^tFdjt5!K0FgWrR9BQY>wi9OFuZLp232Z^7ghr ztQCRzAcrGMt@c>g+*O_=bY-~0I@>*xC!1frWS!sjtxcXgas^+m*yP)-D<<=30s194qFqa))xH-T)4fG delta 3263 zcmc&$U1%It6h4~<6m6R34~_Y8wy9lcn{7>m)7Q!4sE4{~5AI#mb@kVO`d8D>-qfTHS=)W4C* zzg}p*Y7%ZB@oc5{x=YUBpdi^W_V}=sIC+~oY-|cSU)!-&> zZx8Pg9CIofWm}<4VO55va4(N(QpKARq#QiiWS9GS*m%alMHaRtVqs6>x4=r8Qn>U? z0`C_ojQPWeS>9^?B48|wH7fFBrO+)bdWgWWZ2<(zT6c#VtN;JKBZMjJ^irMydHG-L#!hl3#rvy~;ijjw6Jo$@Z0oYMC zHXK;Uy*LssGc=EB4a86(?&E+a^V-d%f|SBjPKBk{3$qe>7IPT{8pZ#dvMl+T#2aJL z4Y5ID@|RV!^ZubiK-P?HbR@UqCo53ie=#re7oqigN zHR60X`gMTMUAb$V+rqQpU(1`1Dy%RiA=z=AxePxlOn}<1@QX2tTm(pxT1l#68hicn zmj?Ujdc^rlPzu|n%2ZvE6cvl>zSvy+Rjj4XRlYI;>sM|o5Phju+i>oeB%v#*dPPcJ z7pRxGid_saY4C6yJEW*x($gq#d0x}Sd_DhUn>Pi%#PL+;j&9v{(r^*mJIt16E*fH$Y zCz*yOH6dyusw4CIY||e)KrcKIZR_klcvri$ZkUA z(q+P%MfYHmp3ovFy&+;ZgUdEGEb(fWS(p^{loQvWHE9aUI?7>NqW*{#VEi$g$?MkW$K zo8zB*pFQ*Oey8uFUzAeg6tASy7HvWFT1-b^JxwF9X?i$}k(|UQuuAr?ujOLL;2T8T z>IZiA=8aogx8gJzM5}%u%tVYeG6Ka X`z~CDJWq3>tDX1tpK`{owRZdm;L*}g diff --git a/source/Private/Merge-CISExcelAndCsvData.ps1 b/source/Private/Merge-CISExcelAndCsvData.ps1 index 7fd7cfc..0922c9b 100644 --- a/source/Private/Merge-CISExcelAndCsvData.ps1 +++ b/source/Private/Merge-CISExcelAndCsvData.ps1 @@ -1,5 +1,5 @@ function Merge-CISExcelAndCsvData { - [CmdletBinding()] + [CmdletBinding(DefaultParameterSetName = 'CsvInput')] param ( [Parameter(Mandatory = $true)] [string]$ExcelPath, @@ -7,16 +7,25 @@ function Merge-CISExcelAndCsvData { [Parameter(Mandatory = $true)] [string]$WorksheetName, - [Parameter(Mandatory = $true)] - [string]$CsvPath + [Parameter(Mandatory = $true, ParameterSetName = 'CsvInput')] + [string]$CsvPath, + + [Parameter(Mandatory = $true, ParameterSetName = 'ObjectInput')] + [CISAuditResult[]]$AuditResults ) process { - # Import data from Excel and CSV + # Import data from Excel $import = Import-Excel -Path $ExcelPath -WorksheetName $WorksheetName - $csvData = Import-Csv -Path $CsvPath - # Iterate over each item in the imported Excel object and merge with CSV data + # Import data from CSV or use provided object + $csvData = if ($PSCmdlet.ParameterSetName -eq 'CsvInput') { + Import-Csv -Path $CsvPath + } else { + $AuditResults + } + + # Iterate over each item in the imported Excel object and merge with CSV data or audit results $mergedData = foreach ($item in $import) { $csvRow = $csvData | Where-Object { $_.Rec -eq $item.'recommendation #' } if ($csvRow) { @@ -29,4 +38,4 @@ function Merge-CISExcelAndCsvData { # Return the merged data return $mergedData } -} +} \ No newline at end of file diff --git a/source/Public/Sync-CISExcelAndCsvData.ps1 b/source/Public/Sync-CISExcelAndCsvData.ps1 index e07b725..4b79249 100644 --- a/source/Public/Sync-CISExcelAndCsvData.ps1 +++ b/source/Public/Sync-CISExcelAndCsvData.ps1 @@ -1,14 +1,16 @@ <# .SYNOPSIS - Synchronizes data between an Excel file and a CSV file and optionally updates the Excel worksheet. + Synchronizes data between an Excel file and either a CSV file or an output object from Invoke-M365SecurityAudit, and optionally updates the Excel worksheet. .DESCRIPTION - The Sync-CISExcelAndCsvData function merges data from a specified Excel file and a CSV file based on a common key. It can also update the Excel worksheet with the merged data. This function is particularly useful for updating Excel records with additional data from a CSV file while preserving the original formatting and structure of the Excel worksheet. + The Sync-CISExcelAndCsvData function merges data from a specified Excel file with data from either a CSV file or an output object from Invoke-M365SecurityAudit based on a common key. It can also update the Excel worksheet with the merged data. This function is particularly useful for updating Excel records with additional data from a CSV file or audit results while preserving the original formatting and structure of the Excel worksheet. .PARAMETER ExcelPath The path to the Excel file that contains the original data. This parameter is mandatory. .PARAMETER WorksheetName The name of the worksheet within the Excel file that contains the data to be synchronized. This parameter is mandatory. .PARAMETER CsvPath - The path to the CSV file containing data to be merged with the Excel data. This parameter is mandatory. + The path to the CSV file containing data to be merged with the Excel data. This parameter is mandatory when using the CsvInput parameter set. + .PARAMETER AuditResults + An array of CISAuditResult objects from Invoke-M365SecurityAudit to be merged with the Excel data. This parameter is mandatory when using the ObjectInput parameter set. .PARAMETER SkipUpdate If specified, the function will return the merged data object without updating the Excel worksheet. This is useful for previewing the merged data. .EXAMPLE @@ -17,6 +19,14 @@ .EXAMPLE PS> $mergedData = Sync-CISExcelAndCsvData -ExcelPath "path\to\excel.xlsx" -WorksheetName "DataSheet" -CsvPath "path\to\data.csv" -SkipUpdate Retrieves the merged data object for preview without updating the Excel worksheet. + .EXAMPLE + PS> $auditResults = Invoke-M365SecurityAudit -TenantAdminUrl "https://tenant-admin.url" -DomainName "example.com" + PS> Sync-CISExcelAndCsvData -ExcelPath "path\to\excel.xlsx" -WorksheetName "DataSheet" -AuditResults $auditResults + Merges data from the audit results into 'excel.xlsx' on the 'DataSheet' worksheet and updates the worksheet with the merged data. + .EXAMPLE + PS> $auditResults = Invoke-M365SecurityAudit -TenantAdminUrl "https://tenant-admin.url" -DomainName "example.com" + PS> $mergedData = Sync-CISExcelAndCsvData -ExcelPath "path\to\excel.xlsx" -WorksheetName "DataSheet" -AuditResults $auditResults -SkipUpdate + Retrieves the merged data object for preview without updating the Excel worksheet. .INPUTS None. You cannot pipe objects to Sync-CISExcelAndCsvData. .OUTPUTS @@ -30,8 +40,9 @@ https://criticalsolutionsnetwork.github.io/M365FoundationsCISReport/#Sync-CISExcelAndCsvData #> + function Sync-CISExcelAndCsvData { - [CmdletBinding()] + [CmdletBinding(DefaultParameterSetName = 'CsvInput')] param ( [Parameter(Mandatory = $true)] [ValidateScript({ Test-Path $_ })] @@ -40,10 +51,13 @@ function Sync-CISExcelAndCsvData { [Parameter(Mandatory = $true)] [string]$WorksheetName, - [Parameter(Mandatory = $true)] + [Parameter(Mandatory = $true, ParameterSetName = 'CsvInput')] [ValidateScript({ Test-Path $_ })] [string]$CsvPath, + [Parameter(Mandatory = $true, ParameterSetName = 'ObjectInput')] + [CISAuditResult[]]$AuditResults, + [Parameter(Mandatory = $false)] [switch]$SkipUpdate ) @@ -55,8 +69,12 @@ function Sync-CISExcelAndCsvData { Assert-ModuleAvailability -ModuleName $module.ModuleName -RequiredVersion $module.RequiredVersion -SubModuleName $module.SubModuleName } - # Merge Excel and CSV data - $mergedData = Merge-CISExcelAndCsvData -ExcelPath $ExcelPath -WorksheetName $WorksheetName -CsvPath $CsvPath + # Merge Excel and CSV data or Audit Results + if ($PSCmdlet.ParameterSetName -eq 'CsvInput') { + $mergedData = Merge-CISExcelAndCsvData -ExcelPath $ExcelPath -WorksheetName $WorksheetName -CsvPath $CsvPath + } else { + $mergedData = Merge-CISExcelAndCsvData -ExcelPath $ExcelPath -WorksheetName $WorksheetName -AuditResults $AuditResults + } # Output the merged data if the user chooses to skip the update if ($SkipUpdate) { @@ -68,3 +86,4 @@ function Sync-CISExcelAndCsvData { } } +