Functions/New-AHPackageDownload.ps1
<#
.SYNOPSIS Create a new package from the evidence package definition file. .DESCRIPTION Create a new package from the download package definition file by copying relevant files from the storage accounts to a local folder. .PARAMETER EvidencePackageDefinitionFile The path to the package definition file .EXAMPLE New-AHPackageDownload -DownloadPackageDefinitionFile .\DownloadPackageDefinitionFile.json .NOTES An example DownloadPackageDefinitionFile: [ { "SubscriptionId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "EvidenceLocations": [ { "SAName": "xxpolicyreportingsa", "SAGroup": "MonitoringServices-rg", "Container": "xxpolicyexports", "FileFilters": [ "*" ], "ExcludeFilter": [], "DestinationPath": ".\\XX\\Identity\\" }, { "SAName": "xxpolicyreportingsa", "SAGroup": "MonitoringServices-usva-rg", "Container": "xxallresourcessummary", "FileFilters": [ "*" ], "ExcludeFilter": [ "Test-*" ], "DestinationPath": ".\\XX\\Azure Resource List\\" } ] }, { "SubscriptionId": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy", "EvidenceLocations": [ { "SAName": "yypolicyreportingsa", "SAGroup": "MonitoringServices-rg", "Container": "yypolicyexports", "FileFilters": [ "*" ], "ExcludeFilter": [], "DestinationPath": ".\\YY\\Identity\\" }, { "SAName": "yypolicyreportingsa", "SAGroup": "MonitoringServices-usva-rg", "Container": "yyallresourcessummary", "FileFilters": [ "*" ], "ExcludeFilter": [ "Test-*" ], "DestinationPath": ".\\YY\\Azure Resource List\\" } ] } ] #> Function New-AHPackageDownload { [CmdletBinding()] [Alias('New-AHEvidencePackage')] param( [Alias('EvidencePackageDefinitionFile')] [Parameter(Mandatory = $true)] [string] [ValidateScript({ Test-Path $_ -PathType Leaf })] $DownloadPackageDefinitionFile ) begin { $tempLocation = Join-Path $env:TEMP EvidencePackage if (!(Test-Path $tempLocation -PathType Container)) { mkdir $tempLocation | Out-Null } } process { $definition = Get-Content $DownloadPackageDefinitionFile | ConvertFrom-Json $filesExported = @() ForEach ($package in $definition) { Write-Verbose "Processing $($package.SubscriptionId)" $azContextSplat = @{ SubscriptionId = $package.SubscriptionId } If ($package.TenantId) { $azContextSplat.Add('TenantId', $package.TenantId) } Set-AzContext @azContextSplat | Out-Null $targets = $package.EvidenceLocations ForEach ($target in $targets) { Write-Verbose "Processing $($target.SAName) - $($target.Container)" $targetContext = New-AzStorageContext -StorageAccountName $target.SAName -UseConnectedAccount $blobs = Get-AzStorageBlob -Container $target.Container -Blob * -Context $targetContext If ($blobs) { $tempPath = ($blobs | Sort-Object LastModified -Descending )[0].name.split('/') $tempPath = $tempPath[0..$($tempPath.count - 2)] -join ('/') $recentBlobs = $blobs | Where-Object { $_.Name -like "$tempPath*" } foreach ($filter in $target.FileFilters) { $passesFilter = $recentBlobs | Where-Object { $_.name.split('/')[-1] -like $filter } forEach ($exclusion in $target.ExcludeFilter) { $passesFilter = $passesFilter | Where-Object { $_.Name.split('/')[-1] -notlike $exclusion } } ForEach ($toExport in $passesFilter) { If (!(Test-Path $target.DestinationPath -PathType Container)) { mkdir $($target.DestinationPath) | Out-Null } Get-AzStorageBlobContent -Container $target.Container -Blob $toExport.Name -Destination $tempLocation -Context $targetContext -Force | Out-Null Move-Item -Path $(Join-Path $tempLocation $toExport.Name) -Destination $target.DestinationPath -Force | Out-Null } $filesExported += $passesFilter } } } } } end { Remove-Item $tempLocation -Recurse -Force $filesExported | Select-Object * -ExpandProperty LastModified | Group-Object Date | Select-Object count, @{N = 'Date Collected'; E = { Get-Date $_.Name -Format MM/dd/yyyy } }, group } } |