diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml index cf52e21..069cde9 100644 --- a/.github/workflows/Release.yml +++ b/.github/workflows/Release.yml @@ -8,7 +8,7 @@ jobs: publish-to-gallery: runs-on: windows-2019 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set PSRepository to Trusted for PowerShell Gallery shell: pwsh run: | @@ -29,7 +29,7 @@ jobs: needs: publish-to-gallery runs-on: ubuntu-latest steps: - - uses: Eomm/why-don-t-you-tweet@v1 + - uses: Eomm/why-don-t-you-tweet@v2 # We don't want to tweet if the repository is not a public one if: ${{ !github.event.repository.private }} with: diff --git a/AsBuiltReport.Microsoft.Azure.json b/AsBuiltReport.Microsoft.Azure.json index 7c5264e..68ada06 100644 --- a/AsBuiltReport.Microsoft.Azure.json +++ b/AsBuiltReport.Microsoft.Azure.json @@ -9,7 +9,8 @@ "ShowTableCaptions": true }, "Options": { - "ShowSectionInfo": true + "ShowSectionInfo": true, + "ShowTags": true }, "Filter": { "Subscription": ["*"] @@ -24,7 +25,10 @@ "KeyVault": 1, "LoadBalancer": 1, "NetworkSecurityGroup": 1, - "PolicyAssignment": 1, + "Policy": { + "Assignments": 1, + "Definitions": 0 + }, "RecoveryServicesVault": 1, "RouteTable": 1, "SiteRecovery": 1, @@ -42,7 +46,9 @@ }, "StorageAccount": { "ProvisioningState": true, - "EnableHttpsTrafficOnly": true, + "StorageAccountKeyAccess": true, + "SecureTransfer": true, + "BlobAnonymousAccess": true, "PublicNetworkAccess": true, "MinimumTlsVersion": true }, diff --git a/AsBuiltReport.Microsoft.Azure.psd1 b/AsBuiltReport.Microsoft.Azure.psd1 index c08b260..c3aff43 100644 --- a/AsBuiltReport.Microsoft.Azure.psd1 +++ b/AsBuiltReport.Microsoft.Azure.psd1 @@ -12,7 +12,7 @@ RootModule = 'AsBuiltReport.Microsoft.Azure.psm1' # Version number of this module. -ModuleVersion = '0.1.6' +ModuleVersion = '0.1.7' # Supported PSEditions # CompatiblePSEditions = @() @@ -27,7 +27,7 @@ Author = 'Tim Carman' # CompanyName = 'Unknown' # Copyright statement for this module -Copyright = '(c) 2023 Tim Carman. All rights reserved.' +Copyright = '(c) 2024 Tim Carman. All rights reserved.' # Description of the functionality provided by this module Description = 'A PowerShell module to generate an as built report on the configuration of Microsoft Azure.' @@ -54,7 +54,7 @@ Description = 'A PowerShell module to generate an as built report on the configu RequiredModules = @( @{ ModuleName = 'AsBuiltReport.Core'; - ModuleVersion = '1.3.0' + ModuleVersion = '1.4.0' } ) diff --git a/CHANGELOG.md b/CHANGELOG.md index 01f8f0a..fa7fc41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,48 +1,67 @@ # :arrows_clockwise: Microsoft Azure As Built Report Changelog +## [[0.1.7](https://github.com/AsBuiltReport/AsBuiltReport.Microsoft.Azure/releases/tag/v0.1.7)] - 2024-10-13 + +### Added +* Add support for Azure Policy definitions +* Add Try/Catch blocks for improved error handling + +### Fixed +* Fix issue with Azure Subscription Lookup Hashtable +* Fix issue with Azure Policy assignments (Fix [#16](https://github.com/AsBuiltReport/AsBuiltReport.Microsoft.Azure/issues/16)) + +### Changed +* Performance improvements +* Update GitHub Action release workflow +* Improve reporting for Azure Tenant +* Improve reporting for Azure Policy assignments +* Improve reporting for Key Vaults +* Improve reporting for Storage Accounts +* Improve reporting for Network Security Groups + ## [[0.1.6](https://github.com/AsBuiltReport/AsBuiltReport.Microsoft.Azure/releases/tag/v0.1.6)] - 2023-11-14 ### Added -* Added initial support for Route Tables (@howardhaooooo) +* Add initial support for Route Tables (@howardhaooooo) ## [[0.1.5](https://github.com/AsBuiltReport/AsBuiltReport.Microsoft.Azure/releases/tag/v0.1.5)] - 2023-05-24 ### Added -* Added initial support for Storage Account (@rebelinux) +* Add initial support for Storage Account (@rebelinux) ### Fixed -* Fixed issue with Az module version check (Fix [#10](https://github.com/AsBuiltReport/AsBuiltReport.Microsoft.Azure/issues/10)) +* Fix issue with Az module version check (Fix [#10](https://github.com/AsBuiltReport/AsBuiltReport.Microsoft.Azure/issues/10)) ## [[0.1.4](https://github.com/AsBuiltReport/AsBuiltReport.Microsoft.Azure/releases/tag/v0.1.4)] - 2023-03-19 ### Added -* Added function to check for Microsoft Azure PowerShell module -* Added `ShowSectionInfo` option to provide information about Azure resources +* Add function to check for Microsoft Azure PowerShell module +* Add `ShowSectionInfo` option to provide information about Azure resources ## [[0.1.3](https://github.com/AsBuiltReport/AsBuiltReport.Microsoft.Azure/releases/tag/v0.1.3)] - 2023-03-17 ### Added -* Added examples to `README.md` -* Added module information and version checks to verbose messaging +* Add examples to `README.md` +* Add module information and version checks to verbose messaging ### Changed * Further improvements to section headings & TOC structure -* Updated Required Privileges information in `README.md` +* Update Required Privileges information in `README.md` ### Fixed -* Fixes [#4](https://github.com/AsBuiltReport/AsBuiltReport.Microsoft.Azure/issues/4) -* Fixes [#5](https://github.com/AsBuiltReport/AsBuiltReport.Microsoft.Azure/issues/5) -* Fixes [#6](https://github.com/AsBuiltReport/AsBuiltReport.Microsoft.Azure/issues/6) +* Fix [#4](https://github.com/AsBuiltReport/AsBuiltReport.Microsoft.Azure/issues/4) +* Fix [#5](https://github.com/AsBuiltReport/AsBuiltReport.Microsoft.Azure/issues/5) +* Fix [#6](https://github.com/AsBuiltReport/AsBuiltReport.Microsoft.Azure/issues/6) ## [[0.1.2](https://github.com/AsBuiltReport/AsBuiltReport.Microsoft.Azure/releases/tag/v0.1.2)] - 2023-02-23 ### Changed -* Improved section heading & TOC structure -* Removed Microsoft logo from default report style due to [licensing requirements](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks) -* Changed default report style font to 'Segoe Ui' to align with [Microsoft guidelines](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/f/font-font-style) -* Improved bug and feature request templates +* Improve section heading & TOC structure +* Remove Microsoft logo from default report style due to [licensing requirements](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks) +* Change default report style font to 'Segoe Ui' to align with [Microsoft guidelines](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/f/font-font-style) +* Improve bug and feature request templates ### Fixed -* Fixes [#1](https://github.com/AsBuiltReport/AsBuiltReport.Microsoft.Azure/issues/1) +* Fix [#1](https://github.com/AsBuiltReport/AsBuiltReport.Microsoft.Azure/issues/1) ## [0.1.1] - 2022-02-14 diff --git a/README.md b/README.md index 36634fb..ec06526 100644 --- a/README.md +++ b/README.md @@ -87,10 +87,10 @@ The least privileged roles required to generate a Microsoft Azure As Built Repor Open a PowerShell terminal window and install each of the required modules. -:warning: Microsoft Az 9.4.0 or higher is required. Please ensure older Az modules have been uninstalled. +:warning: Microsoft Az 12.0.0 or higher is required. Please ensure older Az modules have been uninstalled. ```powershell -install-module Az -MinimumVersion 9.4.0 +install-module Az -MinimumVersion 12.0.0 install-module AsBuiltReport.Microsoft.Azure ``` @@ -143,6 +143,7 @@ The **Options** schema allows certain options within the report to be toggled on | Sub-Schema | Setting | Default | Description | |--------------------|--------------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | ShowSectionInfo | true / false | true | Toggle to enable/disable information relating to Azure resources within each section. | +| ShowTags | true / false | true | Toggle to enable/disable the display of Azure resource tags.

_**Note:** Reporting of tags is not currently available on all Azure resources. Tags will only be displayed for Azure resources when the relevant section [InfoLevel](#infolevel) is configured to 2 or higher._ | ### Filter The **Filter** schema allows report content to be filtered to specific Azure subscriptions within a tenant. @@ -189,7 +190,9 @@ The table below outlines the default and maximum **InfoLevel** settings for each | IpGroup | 1 | 2 | | KeyVault | 1 | 1 | | LoadBalancer | 1 | 2 | -| PolicyAssignment | 1 | 1 | +| NetworkSecurityGroup | 1 | 2 | +| Policy > Assignments | 1 | 2 | +| Policy > Definitions | 0 | 1 | | RecoveryServicesVault | 1 | 2 | | RouteTable | 1 | 2 | | SiteRecovery | 1 | 1 | @@ -205,7 +208,7 @@ The **ExpressRoute** schema is used to configure health checks for Azure Express | Sub-Schema | Setting | Default | Description | Highlight | |---------------|--------------|---------|-------------|---------------------------------------------------------------------------------------------------| -| CircuitStatus | true / false | true | Highlights ExpressRoute circuits which are not enabled | ![Critical](https://via.placeholder.com/15/FEDDD7/FEDDD7.png) ExpressRoute circuit is not enabled | +| CircuitStatus | true / false | true | Highlights ExpressRoute circuits which are disabled | ![Critical](https://via.placeholder.com/15/FEDDD7/FEDDD7.png) ExpressRoute circuit is disabled | #### SiteRecovery The **SiteRecovery** schema is used to configure health checks for Azure Site Recovery. @@ -218,12 +221,14 @@ The **SiteRecovery** schema is used to configure health checks for Azure Site Re #### StorageAccount The **StorageAccount** schema is used to configure health checks for Azure Storage Account. -| Sub-Schema | Setting | Default | Description | Highlight | -|------------------------|--------------|---------|-------------|----------------------------------------------------------------------------------------------------| -| ProvisioningState | true / false | true | | ![Critical](https://via.placeholder.com/15/FEDDD7/FEDDD7.png) Provisioning is in a critical state | -| EnableHttpsTrafficOnly | true / false | true | | ![Warning](https://via.placeholder.com/15/FFF4C7/FFF4C7.png) | -| PublicNetworkAccess | true / false | true | | ![Warning](https://via.placeholder.com/15/FFF4C7/FFF4C7.png) | -| MinimumTlsVersion | true / false | true | | ![Warning](https://via.placeholder.com/15/FFF4C7/FFF4C7.png) | +| Sub-Schema | Setting | Default | Description | Highlight | +|-------------------------|--------------|---------|-------------|----------------------------------------------------------------------------------------------------| +| ProvisioningState | true / false | true | Highlights storage accounts which are in a critical state | ![Critical](https://via.placeholder.com/15/FEDDD7/FEDDD7.png) Provisioning is in a critical state | +| StorageAccountKeyAccess | true / false | true | Highlights storage accounts which have storage account key access enabled | ![Warning](https://via.placeholder.com/15/FFF4C7/FFF4C7.png) Storage account key access is enabled | +| SecureTransfer | true / false | true | Highlights storage accounts which do not have secure transfer enabled | ![Warning](https://via.placeholder.com/15/FFF4C7/FFF4C7.png) Secure transfer is disabled | +| BlobAnonymousAccess | true / false | true | Highlights storage accounts which have Blob anonymous read access enabled | ![Warning](https://via.placeholder.com/15/FFF4C7/FFF4C7.png) Anonymous read access is enabled | +| PublicNetworkAccess | true / false | true | Highlights storage accounts which have public network access enabled | ![Warning](https://via.placeholder.com/15/FFF4C7/FFF4C7.png) Public network access is enabled | +| MinimumTlsVersion | true / false | true | Highlights storage accounts which have TLS 1.0 or TLS 1.1 configured | ![Warning](https://via.placeholder.com/15/FFF4C7/FFF4C7.png) TLS version 1.0 or 1.1 configured | #### VirtualMachine The **VirtualMachine** schema is used to configure health checks for Azure Virtual Machines. @@ -231,7 +236,7 @@ The **VirtualMachine** schema is used to configure health checks for Azure Virtu | Sub-Schema | Setting | Default | Description | Highlight | |-----------------|--------------|---------|-----------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Status | true / false | true | Highlights VMs which are not in a running state | ![Warning](https://via.placeholder.com/15/FFF4C7/FFF4C7.png) VM is in a deallocated state | -| DiskEncryption | true / false | true | Highlights VMs which do not have disk encryption enabled | ![Warning](https://via.placeholder.com/15/FFF4C7/FFF4C7.png) Disk encryption is not enabled | +| DiskEncryption | true / false | true | Highlights VMs which do not have disk encryption enabled | ![Warning](https://via.placeholder.com/15/FFF4C7/FFF4C7.png) Disk encryption is disabled | | BootDiagnostics | true / false | true | Highlights VMs which do not have boot diagnostics enabled with a custom storage account | ![Critical](https://via.placeholder.com/15/FEDDD7/FEDDD7.png) Boot diagnostics is disabled
![Warning](https://via.placeholder.com/15/FFF4C7/FFF4C7.png) Boot diagnostics is enabled with a managed storage account | | BackupEnabled | true / false | true | Highlights VMs which do not have Azure Backup enabled | ![Warning](https://via.placeholder.com/15/FFF4C7/FFF4C7.png) Backup is disabled | ## :computer: Examples diff --git a/Src/Private/Get-AbrAsrProtectedItems.ps1 b/Src/Private/Get-AbrAsrProtectedItems.ps1 index 35ab658..1157425 100644 --- a/Src/Private/Get-AbrAsrProtectedItems.ps1 +++ b/Src/Private/Get-AbrAsrProtectedItems.ps1 @@ -1,11 +1,11 @@ function Get-AbrAsrProtectedItems { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Site Recovery Protected Items information + Used by As Built Report to retrieve Azure Site Recovery Protected Items information .DESCRIPTION .NOTES - Version: 0.1.0 + Version: 0.1.1 Author: Tim Carman Twitter: @tpcarman Github: tpcarman @@ -24,45 +24,52 @@ function Get-AbrAsrProtectedItems { } process { - $AzRsvs = Get-AzRecoveryServicesVault - if (($InfoLevel.SiteRecovery -gt 0) -and ($AzRsvs)) { - foreach ($AzRsv in $AzRsvs) { - $AsrVaultContext = Set-AzRecoveryServicesAsrVaultContext -Vault $AzRsv - $AsrPolicy = Get-AzRecoveryServicesAsrPolicy | Where-Object {$_.ReplicationProvider -eq 'A2A'} - $AsrFabrics = Get-AzRecoveryServicesAsrFabric - if ($AsrPolicy) { - Write-PscriboMessage "Collecting Azure Site Recovery Protected Items information." - Section -Style Heading4 'Site Recovery' { - foreach ($AsrFabric in $AsrFabrics) { - $AsrContainer = Get-AzRecoveryServicesAsrProtectionContainer -Fabric $AsrFabric - $AsrReplicationProtectedItems = Get-AzRecoveryServicesAsrReplicationProtectedItem -ProtectionContainer $AsrContainer | Sort-Object FriendlyName - if ($Healthcheck.SiteRecovery.ReplicationHealth) { - $AsrReplicationProtectedItems | Where-Object { $_.'replicationhealth' -eq 'Critical' } | Set-Style -Style Critical -Property 'replicationhealth' - } - if ($Healthcheck.SiteRecovery.FailoverHealth) { - $AsrReplicationProtectedItems | Where-Object { $_.'TestFailoverStateDescription' -ne 'None' } | Set-Style -Style Warning -Property 'TestFailoverStateDescription' - } - if ($AsrReplicationProtectedItems) { - Section -Style NOTOCHeading5 -ExcludeFromTOC 'Protected Items' { - Paragraph "The following tables provides information for the Azure Site Recovery protected items within the $($AzSubscription.Name) subscription." - BlankLine - $TableParams = @{ - Name = "Site Recovery Protectected Items - $($AzRsv.Name)" - List = $false - Headers = 'Virtual Machine', 'Replication Health', 'State', 'Active Location', 'Target Location', 'Failover Health' - Columns = 'friendlyname', 'replicationhealth', 'protectionstatedescription', 'PrimaryFabricFriendlyName', 'RecoveryFabricFriendlyName', 'TestFailoverStateDescription' - ColumnWidths = 21, 15, 15, 17, 17, 15 + Try { + if ($InfoLevel.SiteRecovery -gt 0) { + $AzRsvs = Get-AzRecoveryServicesVault | Sort-Object Name + if ($AzRsvs) { + foreach ($AzRsv in $AzRsvs) { + Write-PscriboMessage "Collecting Azure Site Recovery information [$($AzRsv.Name)]." + $AsrVaultContext = Set-AzRecoveryServicesAsrVaultContext -Vault $AzRsv -ErrorAction SilentlyContinue + $AsrPolicy = Get-AzRecoveryServicesAsrPolicy -ErrorAction SilentlyContinue | Where-Object {$_.ReplicationProvider -eq 'A2A'} + $AsrFabrics = Get-AzRecoveryServicesAsrFabric -ErrorAction SilentlyContinue + if ($AsrPolicy) { + Write-PscriboMessage "Collecting Azure Site Recovery Protected Items information." + Section -Style Heading4 'Site Recovery' { + foreach ($AsrFabric in $AsrFabrics) { + $AsrContainer = Get-AzRecoveryServicesAsrProtectionContainer -Fabric $AsrFabric -ErrorAction SilentlyContinue + $AsrReplicationProtectedItems = Get-AzRecoveryServicesAsrReplicationProtectedItem -ProtectionContainer $AsrContainer -ErrorAction SilentlyContinue | Sort-Object FriendlyName + if ($Healthcheck.SiteRecovery.ReplicationHealth) { + $AsrReplicationProtectedItems | Where-Object { $_.'replicationhealth' -eq 'Critical' } | Set-Style -Style Critical -Property 'replicationhealth' + } + if ($Healthcheck.SiteRecovery.FailoverHealth) { + $AsrReplicationProtectedItems | Where-Object { $_.'TestFailoverStateDescription' -ne 'None' } | Set-Style -Style Warning -Property 'TestFailoverStateDescription' } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" + if ($AsrReplicationProtectedItems) { + Section -Style NOTOCHeading5 -ExcludeFromTOC 'Protected Items' { + Paragraph "The following tables provides information for the Azure Site Recovery protected items within the $($AzSubscription.Name) subscription." + BlankLine + $TableParams = @{ + Name = "Site Recovery Protectected Items - $($AzRsv.Name)" + List = $false + Headers = 'Virtual Machine', 'Replication Health', 'State', 'Active Location', 'Target Location', 'Failover Health' + Columns = 'friendlyname', 'replicationhealth', 'protectionstatedescription', 'PrimaryFabricFriendlyName', 'RecoveryFabricFriendlyName', 'TestFailoverStateDescription' + ColumnWidths = 21, 15, 15, 17, 17, 15 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AsrReplicationProtectedItems | Table @TableParams + } } - $AsrReplicationProtectedItems | Table @TableParams } } } } } } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzAvailabilitySet.ps1 b/Src/Private/Get-AbrAzAvailabilitySet.ps1 index 8cc39a2..9f01d9f 100644 --- a/Src/Private/Get-AbrAzAvailabilitySet.ps1 +++ b/Src/Private/Get-AbrAzAvailabilitySet.ps1 @@ -1,7 +1,7 @@ function Get-AbrAzAvailabilitySet { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Availability Set information + Used by As Built Report to retrieve Azure Availability Set information .DESCRIPTION .NOTES @@ -23,46 +23,50 @@ function Get-AbrAzAvailabilitySet { } process { - $AzAvailabilitySets = Get-AzAvailabilitySet | Sort-Object Name - if (($InfoLevel.AvailabilitySet -gt 0) -and ($AzAvailabilitySets)) { - Write-PscriboMessage "Collecting Azure Availability Set information." - Section -Style Heading4 'Availability Sets' { - if ($Options.ShowSectionInfo) { - Paragraph "An Availability Set (AS) is a logical construct to inform Azure that it should distribute contained virtual machine instances across multiple fault and update domains within an Azure region." - BlankLine - } - Paragraph "The following table summarises the configuration of the availability sets within the $($AzSubscription.Name) subscription." - BlankLine - $AzAvailabilitySetInfo = @() - foreach ($AzAvailabilitySet in $AzAvailabilitySets) { - $InObj = [Ordered]@{ - 'Name' = $AzAvailabilitySet.Name - 'Resource Group' = $AzAvailabilitySet.ResourceGroupName - 'Location' = $AzLocationLookup."$($AzAvailabilitySet.Location)" - 'Subscription' = "$($AzSubscriptionLookup.(($AzAvailabilitySet.Id).split('/')[2]))" - 'SKU' = $AzAvailabilitySet.Sku - 'Virtual Machines' = & { - if ($AzAvailabilitySet.VirtualMachinesReferences.Id) { - ($AzAvailabilitySet.VirtualMachinesReferences.Id | ForEach-Object {$_.split('/')[-1]}) -join ', ' - } else { - 'None' + Try { + if ($InfoLevel.AvailabilitySet -gt 0) { + $AzAvailabilitySets = Get-AzAvailabilitySet | Sort-Object Name + if ($AzAvailabilitySets) { + Write-PscriboMessage "Collecting Azure Availability Set information." + Section -Style Heading4 'Availability Sets' { + if ($Options.ShowSectionInfo) { + Paragraph "An Availability Set (AS) is a logical construct to inform Azure that it should distribute contained virtual machine instances across multiple fault and update domains within an Azure region." + BlankLine + } + Paragraph "The following table summarises the configuration of the availability sets within the $($AzSubscription.Name) subscription." + BlankLine + $AzAvailabilitySetInfo = @() + foreach ($AzAvailabilitySet in $AzAvailabilitySets) { + $InObj = [Ordered]@{ + 'Name' = $AzAvailabilitySet.Name + 'Resource Group' = $AzAvailabilitySet.ResourceGroupName + 'Location' = $AzLocationLookup."$($AzAvailabilitySet.Location)" + 'Subscription' = "$($AzSubscriptionLookup.(($AzAvailabilitySet.Id).split('/')[2]))" + 'SKU' = $AzAvailabilitySet.Sku + 'Virtual Machines' = if ($AzAvailabilitySet.VirtualMachinesReferences.Id) { + ($AzAvailabilitySet.VirtualMachinesReferences.Id | ForEach-Object {$_.split('/')[-1]}) -join ', ' + } else { + 'None' + } } + $AzAvailabilitySetInfo += [PSCustomObject]$InObj } - } - $AzAvailabilitySetInfo += [PSCustomObject]$InObj - } - $TableParams = @{ - Name = "Availability Sets - $($AzSubscription.Name)" - List = $false - Columns = 'Name', 'Resource Group', 'Location', 'SKU', 'Virtual Machines' - ColumnWidths = 25, 20, 20, 15, 20 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" + $TableParams = @{ + Name = "Availability Sets - $($AzSubscription.Name)" + List = $false + Columns = 'Name', 'Resource Group', 'Location', 'SKU', 'Virtual Machines' + ColumnWidths = 25, 20, 20, 15, 20 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzAvailabilitySetInfo | Table @TableParams + } } - $AzAvailabilitySetInfo | Table @TableParams } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzBastion.ps1 b/Src/Private/Get-AbrAzBastion.ps1 index e9ffd0d..b66cbf3 100644 --- a/Src/Private/Get-AbrAzBastion.ps1 +++ b/Src/Private/Get-AbrAzBastion.ps1 @@ -1,11 +1,11 @@ function Get-AbrAzBastion { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Bastion information + Used by As Built Report to retrieve Azure Bastion information .DESCRIPTION .NOTES - Version: 0.1.1 + Version: 0.1.2 Author: Tim Carman Twitter: @tpcarman Github: tpcarman @@ -23,68 +23,83 @@ function Get-AbrAzBastion { } process { - $AzBastions = Get-AzBastion | Sort-Object Name - if (($InfoLevel.Bastion -gt 0) -and ($AzBastions)) { - Write-PscriboMessage "Collecting Azure Bastion information." - Section -Style Heading4 'Bastion' { - if ($Options.ShowSectionInfo) { - Paragraph "Azure Bastion is a service you deploy that lets you connect to a virtual machine using your browser and the Azure portal, or via the native SSH or RDP client already installed on your local computer." - BlankLine - Paragraph "The Azure Bastion service is a fully platform-managed PaaS service that you provision inside your virtual network. It provides secure and seamless RDP/SSH connectivity to your virtual machines directly from the Azure portal over TLS. When you connect via Azure Bastion, your virtual machines don't need a public IP address, agent, or special client software." - BlankLine - Paragraph "Bastion provides secure RDP and SSH connectivity to all of the VMs in the virtual network in which it is provisioned. Using Azure Bastion protects your virtual machines from exposing RDP/SSH ports to the outside world, while still providing secure access using RDP/SSH." - BlankLine - Try { - Image -Text 'Bastion Architecture' -Align 'Center' -Percent 45 -Base64 "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s6d2EzJpjnRvla6sRNQ9GXmWkIiIiJJTsn//MzQmEZnoRsZDflW8ShtTKSU6zpGIugcjzxISERFRckrE9//UsQPqSqIxNCYhmShHwqNMmrO8cosWHtn6SERERERE8Rg5LwJDYxKLhkcZ53jZUs6oStQdGHmWkIiIiKg9GBpTwDm9x2kX+2drI1HXZ+RZQiIiIuq6jBwXydBIRERERESU4hIxLjIehsYkcs+61/Wl5p1UcKi+RERdlZFnCYmIiIjag6ExiTyz/Qv0++wafS3iue1f4llVf+3g0/UaIurKjDxLSERERF2XkfMiMDR2sL+sf6vuchqNL6ux+4zntdvYbdeufBJzTrgPzxz5C20bERERUXdn5MFxKggEArjllltw2WWXwe1267XJ5Z///GeLr0+233bbbdry9OnTceSRR+LTTz/V1puza9cunHjiiXX3oaaMnBeBoTGBotdZbI50LZVtzZVlk+pnRpXg2Hg7u6USdR/d/UCIiKgtjDw4TgX79u1DZWUliouLsWnTJr02uZx66qnaa2vu9Xm9Xnz55Zc444wz9JqIF198MW7IfP311zFs2DB9jToaQyMRURLp7gdCRETUOglQ48ePx1lnnYXnn4/0VEs2hxxyCHr06IF58+bpNfXWrFmDiooKHHvssXoNMGHCBNTW1sYNmXPnzoXP59NrqDlGzovA0EhERERElCKiAeqEE07A5ZdfrgWwsrIyfSuwYsUKratn4/LUU0/VdWtt3A1UuofGdvuUdelaOn/+fO2+ElCjzxHtSipl3Lhx+O6777T6xhwOB37+859jzpw5DVoP5TW88MIL+NnPfob8/Hy9FnA6nTjppJOaDZmffPIJhg8fjrFjx+o11Bwj50VgaCQiSiJGniUkIqLUJyExPT0dBx10EHr37o1Ro0Zh8eLF+lbgqKOOwsqVK+vKvffei9GjR+Oqq67S92ibdevW4e2339YeY+HChVrAk3GIb7zxBhYsWKDVP/PMM7juuusahNZYxxxzTJMutNK19vvvv9dCb2MSgiWUxj6ehEwJktdc03CyyK4m2YenMDQSESURI88SEhFR6vvqq69w8sknIy0tDVarFaeccgo+++wzfWtDMnnM448/jjvvvFPbf39Iy9/dd9+tr0UeS1r8Yh/r8MMP17qYxobWWBJqDz300Aath0uWLEHPnj210NtY//79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" - BlankLine - } Catch { - Write-PScriboMessage -IsWarning "Unable to display Bastion image." - } - } - $AzBastionInfo = @() - foreach ($AzBastion in $AzBastions) { - $InObj = [Ordered]@{ - 'Name' = $AzBastion.Name - 'Resource Group' = $AzBastion.ResourceGroupName - 'Location' = $AzLocationLookup."$($AzBastion.Location)" - 'Subscription' = "$($AzSubscriptionLookup.(($AzBastion.Id).split('/')[2]))" - 'Virtual Network / Subnet' = $AzBastion.IpConfigurations.subnet.id.split('/')[-1] - 'Public DNS Name' = $AzBastion.DnsName - 'Public IP Address' = $AzBastion.IpConfigurations.publicipaddress.id.split('/')[-1] - } - $AzBastionInfo += [PSCustomObject]$InObj - } + Try { + if ($InfoLevel.Bastion -gt 0) { + $AzBastions = Get-AzBastion | Sort-Object Name + if ($AzBastions) { + Write-PScriboMessage "Collecting Azure Bastion information." + Section -Style Heading4 'Bastion' { + if ($Options.ShowSectionInfo) { + Paragraph "Azure Bastion is a service you deploy that lets you connect to a virtual machine using your browser and the Azure portal, or via the native SSH or RDP client already installed on your local computer." + BlankLine + Paragraph "The Azure Bastion service is a fully platform-managed PaaS service that you provision inside your virtual network. It provides secure and seamless RDP/SSH connectivity to your virtual machines directly from the Azure portal over TLS. When you connect via Azure Bastion, your virtual machines don't need a public IP address, agent, or special client software." + BlankLine + Paragraph "Bastion provides secure RDP and SSH connectivity to all of the VMs in the virtual network in which it is provisioned. Using Azure Bastion protects your virtual machines from exposing RDP/SSH ports to the outside world, while still providing secure access using RDP/SSH." + BlankLine + Try { + Image -Text 'Bastion Architecture' -Align 'Center' -Percent 45 -Base64 "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s6d2EzJpjnRvla6sRNQ9GXmWkIiIiJJTsn//MzQmEZnoRsZDflW8ShtTKSU6zpGIugcjzxISERFRckrE9//UsQPqSqIxNCYhmShHwqNMmrO8cosWHtn6SERERERE8Rg5LwJDYxKLhkcZ53jZUs6oStQdGHmWkIiIiKg9GBpTwDm9x2kX+2drI1HXZ+RZQiIiIuq6jBwXydBIRERERESU4hIxLjIehsYkcs+61/Wl5p1UcKi+RERdlZFnCYmIiIjag6ExiTyz/Qv0++wafS3iue1f4llVf+3g0/UaIurKjDxLSERERF2XkfMiMDR2sL+sf6vuchqNL6ux+4zntdvYbdeufBJzTrgPzxz5C20bERERUXdn5MFxKggEArjllltw2WWXwe1267XJ5Z///GeLr0+233bbbdry9OnTceSRR+LTTz/V1puza9cunHjiiXX3oaaMnBeBoTGBotdZbI50LZVtzZVlk+pnRpXg2Hg7u6USdR/d/UCIiKgtjDw4TgX79u1DZWUliouLsWnTJr02uZx66qnaa2vu9Xm9Xnz55Zc444wz9JqIF198MW7IfP311zFs2DB9jToaQyMRURLp7gdCRETUOglQ48ePx1lnnYXnn4/0VEs2hxxyCHr06IF58+bpNfXWrFmDiooKHHvssXoNMGHCBNTW1sYNmXPnzoXP59NrqDlGzovA0EhERERElCKiAeqEE07A5ZdfrgWwsrIyfSuwYsUKratn4/LUU0/VdWtt3A1UuofGdvuUdelaOn/+fO2+ElCjzxHtSipl3Lhx+O6777T6xhwOB37+859jzpw5DVoP5TW88MIL+NnPfob8/Hy9FnA6nTjppJOaDZmffPIJhg8fjrFjx+o11Bwj50VgaCQiSiJGniUkIqLUJyExPT0dBx10EHr37o1Ro0Zh8eLF+lbgqKOOwsqVK+vKvffei9GjR+Oqq67S92ibdevW4e2339YeY+HChVrAk3GIb7zxBhYsWKDVP/PMM7juuusahNZYxxxzTJMutNK19vvvv9dCb2MSgiWUxj6ehEwJktdc03CyyK4m2YenMDQSESURI88SEhFR6vvqq69w8sknIy0tDVarFaeccgo+++wzfWtDMnnM448/jjvvvFPbf39Iy9/dd9+tr0UeS1r8Yh/r8MMP17qYxobWWBJqDz300Aath0uWLEHPnj210NtY//79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" + BlankLine + } Catch { + Write-PScriboMessage -IsWarning "Unable to display Bastion image." + } + } + $AzBastionInfo = @() + foreach ($AzBastion in $AzBastions) { + $InObj = [Ordered]@{ + 'Name' = $AzBastion.Name + 'Resource Group' = $AzBastion.ResourceGroupName + 'Location' = $AzLocationLookup."$($AzBastion.Location)" + 'Subscription' = "$($AzSubscriptionLookup.(($AzBastion.Id).split('/')[2]))" + 'Virtual Network / Subnet' = $AzBastion.IpConfigurations.subnet.id.split('/')[-1] + 'Public DNS Name' = $AzBastion.DnsName + 'Public IP Address' = $AzBastion.IpConfigurations.publicipaddress.id.split('/')[-1] + } - if ($InfoLevel.Bastion -ge 2) { - Paragraph "The following sections detail the configuration of the bastions within the $($AzSubscription.Name) subscription." - foreach ($AzBastion in $AzBastionInfo) { - Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzBastion.Name)" { + if ($Options.ShowTags) { + $InObj['Tags'] = If ([string]::IsNullOrEmpty($AzBastion.Tag)) { + 'None' + } else { + ($AzBastion.Tag.GetEnumerator() | ForEach-Object { "$($_.Name):`t$($_.Value)" }) -join [Environment]::NewLine + } + } + + $AzBastionInfo += [PSCustomObject]$InObj + } + + if ($InfoLevel.Bastion -ge 2) { + Paragraph "The following sections detail the configuration of the bastions within the $($AzSubscription.Name) subscription." + foreach ($AzBastion in $AzBastionInfo) { + Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzBastion.Name)" { + $TableParams = @{ + Name = "Bastion - $($AzBastion.Name)" + List = $true + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzBastion | Table @TableParams + } + } + } else { + Paragraph "The following table summarises the configuration of the bastions within the $($AzSubscription.Name) subscription." + BlankLine $TableParams = @{ - Name = "Bastion - $($AzBastion.Name)" - List = $true - ColumnWidths = 50, 50 + Name = "Bastions - $($AzSubscription.Name)" + List = $false + Columns = 'Name', 'Resource Group', 'Location', 'Public IP Address' + ColumnWidths = 25, 25, 25, 25 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } - $AzBastion | Table @TableParams + $AzBastionInfo | Table @TableParams } } - } else { - Paragraph "The following table summarises the configuration of the bastions within the $($AzSubscription.Name) subscription." - BlankLine - $TableParams = @{ - Name = "Bastions - $($AzSubscription.Name)" - List = $false - Columns = 'Name', 'Resource Group', 'Location', 'Public IP Address' - ColumnWidths = 25, 25, 25, 25 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" - } - $AzBastionInfo | Table @TableParams } } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzExpressRouteCircuit.ps1 b/Src/Private/Get-AbrAzExpressRouteCircuit.ps1 index 70055f5..3e5d447 100644 --- a/Src/Private/Get-AbrAzExpressRouteCircuit.ps1 +++ b/Src/Private/Get-AbrAzExpressRouteCircuit.ps1 @@ -1,11 +1,11 @@ function Get-AbrAzExpressRouteCircuit { <# .SYNOPSIS - Used by As Built Report to retrieve Azure ExpressRoute Circuit information + Used by As Built Report to retrieve Azure ExpressRoute Circuit information .DESCRIPTION .NOTES - Version: 0.1.1 + Version: 0.1.2 Author: Tim Carman Twitter: @tpcarman Github: tpcarman @@ -23,74 +23,90 @@ function Get-AbrAzExpressRouteCircuit { } process { - $AzExpressRouteCircuits = Get-AzExpressRouteCircuit | Sort-Object Name - if (($InfoLevel.ExpressRoute -gt 0) -and ($AzExpressRouteCircuits)) { - Write-PscriboMessage "Collecting ExpressRoute Circuit information." - Section -Style Heading4 'ExpressRoute Circuit' { - if ($Options.ShowSectionInfo) { - Paragraph "An ExpressRoute circuit allows a private dedicated connection into Azure with the help of a connectivity provider." - BlankLine - } - $AzExpressRouteCircuitInfo = @() - foreach ($AzExpressRouteCircuit in $AzExpressRouteCircuits) { - $InObj = [Ordered]@{ - 'Name' = $AzExpressRouteCircuit.Name - 'Resource Group' = $AzExpressRouteCircuit.ResourceGroupName - 'Location' = $AzLocationLookup."$($AzExpressRouteCircuit.Location)" - 'Subscription' = "$($AzSubscriptionLookup.(($AzExpressRouteCircuit.Id).split('/')[2]))" - 'Circuit Status' = $AzExpressRouteCircuit.CircuitProvisioningState - 'Provider' = $AzExpressRouteCircuit.ServiceProviderProperties.ServiceProviderName - 'Provider Status' = $AzExpressRouteCircuit.ServiceProviderProvisioningState - 'Peering Location' = $AzExpressRouteCircuit.ServiceProviderProperties.PeeringLocation - 'Bandwidth' = "$($AzExpressRouteCircuit.ServiceProviderProperties.BandwidthInMbps) Mbps" - 'Service Key' = $AzExpressRouteCircuit.ServiceKey - 'SKU' = $AzExpressRouteCircuit.Sku.Tier - 'Billing Model' = Switch ($AzExpressRouteCircuit.Sku.Family) { - 'MeteredData' { 'Metered' } - default { $AzExpressRouteCircuit.Sku.Family } + Try { + if ($InfoLevel.ExpressRoute -gt 0) { + $AzExpressRouteCircuits = Get-AzExpressRouteCircuit | Sort-Object Name + if ($AzExpressRouteCircuits) { + Write-PScriboMessage "Collecting ExpressRoute Circuit information." + Section -Style Heading4 'ExpressRoute Circuit' { + if ($Options.ShowSectionInfo) { + Paragraph "An ExpressRoute circuit allows a private dedicated connection into Azure with the help of a connectivity provider." + BlankLine } - 'Allow Classic Operations' = Switch ($AzExpressRouteCircuit.AllowClassicOperations) { - $true { 'On' } - $false { 'Off' } + $AzExpressRouteCircuitInfo = @() + foreach ($AzExpressRouteCircuit in $AzExpressRouteCircuits) { + $InObj = [Ordered]@{ + 'Name' = $AzExpressRouteCircuit.Name + 'Resource Group' = $AzExpressRouteCircuit.ResourceGroupName + 'Location' = $AzLocationLookup."$($AzExpressRouteCircuit.Location)" + 'Subscription' = "$($AzSubscriptionLookup.(($AzExpressRouteCircuit.Id).split('/')[2]))" + 'Circuit Status' = $AzExpressRouteCircuit.CircuitProvisioningState + 'Provider' = $AzExpressRouteCircuit.ServiceProviderProperties.ServiceProviderName + 'Provider Status' = $AzExpressRouteCircuit.ServiceProviderProvisioningState + 'Peering Location' = $AzExpressRouteCircuit.ServiceProviderProperties.PeeringLocation + 'Bandwidth' = "$($AzExpressRouteCircuit.ServiceProviderProperties.BandwidthInMbps) Mbps" + 'Service Key' = $AzExpressRouteCircuit.ServiceKey + 'SKU' = $AzExpressRouteCircuit.Sku.Tier + 'Billing Model' = Switch ($AzExpressRouteCircuit.Sku.Family) { + 'MeteredData' { 'Metered' } + default { $AzExpressRouteCircuit.Sku.Family } + } + 'Allow Classic Operations' = if ($AzExpressRouteCircuit.AllowClassicOperations) { + 'On' + } else { + 'Off' + } + ##ToDo: Peerings + } + + if ($Options.ShowTags) { + $InObj['Tags'] = if ([string]::IsNullOrEmpty($AzExpressRouteCircuit.Tags)) { + 'None' + } else { + ($AzExpressRouteCircuit.Tags.GetEnumerator() | ForEach-Object { "$($_.Key):`t$($_.Value)" }) -join [Environment]::NewLine + } + } + + $AzExpressRouteCircuitInfo += [PSCustomObject]$InObj } - ##ToDo: Peerings - } - $AzExpressRouteCircuitInfo += [PSCustomObject]$InObj - } - if ($Healthcheck.ExpressRoute.CircuitStatus) { - $AzExpressRouteCircuitInfo | Where-Object { $_.'Circuit Status' -ne 'Enabled' } | Set-Style -Style Critical -Property 'Circuit Status' - } - if ($InfoLevel.ExpressRoute -ge 2) { - Paragraph "The following sections detail the configuration of the ExpressRoute circuits within the $($AzSubscription.Name) subscription." - foreach ($AzExpressRouteCircuit in $AzExpressRouteCircuitInfo) { - Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzExpressRouteCircuit.Name)" { + if ($Healthcheck.ExpressRoute.CircuitStatus) { + $AzExpressRouteCircuitInfo | Where-Object { $_.'Circuit Status' -ne 'Enabled' } | Set-Style -Style Critical -Property 'Circuit Status' + } + if ($InfoLevel.ExpressRoute -ge 2) { + Paragraph "The following sections detail the configuration of the ExpressRoute circuits within the $($AzSubscription.Name) subscription." + foreach ($AzExpressRouteCircuit in $AzExpressRouteCircuitInfo) { + Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzExpressRouteCircuit.Name)" { + $TableParams = @{ + Name = "ExpressRoute Circuit - $($AzExpressRouteCircuit.Name)" + List = $true + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzExpressRouteCircuit | Table @TableParams + } + } + } else { + Paragraph "The following table summarises the configuration of the ExpressRoute circuits within the $($AzSubscription.Name) subscription." + BlankLine $TableParams = @{ - Name = "ExpressRoute Circuit - $($AzExpressRouteCircuit.Name)" - List = $true - ColumnWidths = 50, 50 + Name = "ExpressRoute Circuits - $($AzSubscription.Name)" + List = $false + Columns = 'Name', 'Resource Group', 'Location', 'Circuit Status' + ColumnWidths = 25, 25, 25, 25 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } - $AzExpressRouteCircuit | Table @TableParams + $AzExpressRouteCircuitInfo | Table @TableParams } } - } else { - Paragraph "The following table summarises the configuration of the ExpressRoute circuits within the $($AzSubscription.Name) subscription." - BlankLine - $TableParams = @{ - Name = "ExpressRoute Circuits - $($AzSubscription.Name)" - List = $false - Columns = 'Name', 'Resource Group', 'Location', 'Circuit Status' - ColumnWidths = 25, 25, 25, 25 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" - } - $AzExpressRouteCircuitInfo | Table @TableParams } } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzFirewall.ps1 b/Src/Private/Get-AbrAzFirewall.ps1 index cd50320..eade1ec 100644 --- a/Src/Private/Get-AbrAzFirewall.ps1 +++ b/Src/Private/Get-AbrAzFirewall.ps1 @@ -1,11 +1,11 @@ function Get-AbrAzFirewall { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Firewall information + Used by As Built Report to retrieve Azure Firewall information .DESCRIPTION .NOTES - Version: 0.1.1 + Version: 0.1.2 Author: Tim Carman Twitter: @tpcarman Github: tpcarman @@ -23,81 +23,98 @@ function Get-AbrAzFirewall { } process { - $AzFirewalls = Get-AzFirewall | Sort-Object Name - if (($InfoLevel.Firewall -gt 0) -and ($AzFirewalls)) { - Write-PscriboMessage "Collecting Azure Firewall information." - Section -Style Heading4 'Firewalls' { - if ($Options.ShowSectionInfo) { - Paragraph "Azure Firewall is a cloud-native and intelligent network firewall security service that provides the best of breed threat protection for your cloud workloads running in Azure. It's a fully stateful, firewall as a service with built-in high availability and unrestricted cloud scalability. It provides both east-west and north-south traffic inspection." - BlankLine - } - $AzFirewallInfo = @() - foreach ($AzFirewall in $AzFirewalls) { - $InObj = [Ordered]@{ - 'Name' = $AzFirewall.Name - 'Resource Group' = $AzFirewall.ResourceGroupName - 'Location' = $AzLocationLookup."$($AzFirewall.Location)" - 'Subscription' = "$($AzSubscriptionLookup.(($AzFirewall.Id).split('/')[2]))" - 'Provisioning State' = $AzFirewall.ProvisioningState - <# - 'DNS Server' = Switch ($AzFirewall.DNSServer) { - $null { 'Default (Azure provided' } - default { ($AzFirewall.DNSServer) -join ', ' } + Try { + if ($InfoLevel.Firewall -gt 0) { + $AzFirewalls = Get-AzFirewall | Sort-Object Name + if ($AzFirewalls) { + Write-PScriboMessage "Collecting Azure Firewall information." + Section -Style Heading4 'Firewalls' { + if ($Options.ShowSectionInfo) { + Paragraph "Azure Firewall is a cloud-native and intelligent network firewall security service that provides the best of breed threat protection for your cloud workloads running in Azure. It's a fully stateful, firewall as a service with built-in high availability and unrestricted cloud scalability. It provides both east-west and north-south traffic inspection." + BlankLine } - 'DNS Proxy' = Switch ($AzFirewall.DNSEnableProxy) { - $true { 'Enabled' } - $false { 'Disabled' } + $AzFirewallInfo = @() + foreach ($AzFirewall in $AzFirewalls) { + $InObj = [Ordered]@{ + 'Name' = $AzFirewall.Name + 'Resource Group' = $AzFirewall.ResourceGroupName + 'Location' = $AzLocationLookup."$($AzFirewall.Location)" + 'Subscription' = "$($AzSubscriptionLookup.(($AzFirewall.Id).split('/')[2]))" + 'Provisioning State' = $AzFirewall.ProvisioningState + <# + 'DNS Server' = if ($AzFirewall.DNSServer) { + ($AzFirewall.DNSServer) -join ', ' + } else { + 'Default (Azure provided' + } + 'DNS Proxy' = if ($AzFirewall.DNSEnableProxy) { + 'Enabled' + } else { + 'Disabled' + } + 'Firewall Subnet' = ($AzFirewall.IpConfigurations | Where-Object {$_.Name -eq 'AzureFirewallIpConfiguration0'}).Subnet.Id.Split('/')[-1] + 'Firewall Public IP' = ($AzFirewall.IpConfigurations | Where-Object {$_.Name -eq 'AzureFirewallIpConfiguration0'}).PublicIpAddress.Id.Split('/')[-1] + 'Firewall Private IP' = ($AzFirewall.IpConfigurations | Where-Object {$_.Name -eq 'AzureFirewallIpConfiguration0'}).PrivateIpAddress + #> + 'Firewall SKU' = $AzFirewall.Sku.Tier + 'NAT Rule Collections' = $AzFirewall.NatkRuleCollections.Count + 'Network Rule Collections' = $AzFirewall.NetworkRuleCollections.Count + 'Application Rule Collections' = $AzFirewall.ApplicationRuleCollections.Count + ##ToDo: App Rules + } + + if ($Options.ShowTags) { + $InObj['Tags'] = if ([string]::IsNullOrEmpty($AzFirewall.Tag)) { + 'None' + } else { + ($AzFirewall.Tag.GetEnumerator() | ForEach-Object { "$($_.Name):`t$($_.Value)" }) -join [Environment]::NewLine + } + } + + $AzFirewallInfo += [PSCustomObject]$InObj } - 'Firewall Subnet' = ($AzFirewall.IpConfigurations | Where-Object {$_.Name -eq 'AzureFirewallIpConfiguration0'}).Subnet.Id.Split('/')[-1] - 'Firewall Public IP' = ($AzFirewall.IpConfigurations | Where-Object {$_.Name -eq 'AzureFirewallIpConfiguration0'}).PublicIpAddress.Id.Split('/')[-1] - 'Firewall Private IP' = ($AzFirewall.IpConfigurations | Where-Object {$_.Name -eq 'AzureFirewallIpConfiguration0'}).PrivateIpAddress - #> - 'Firewall SKU' = $AzFirewall.Sku.Tier - 'NAT Rule Collections' = $AzFirewall.NatkRuleCollections.Count - 'Network Rule Collections' = $AzFirewall.NetworkRuleCollections.Count - 'Application Rule Collections' = $AzFirewall.ApplicationRuleCollections.Count - ##ToDo: App Rules - } - $AzFirewallInfo += [PSCustomObject]$InObj - } - if ($InfoLevel.Firewall -ge 2) { - Paragraph "The following sections detail the configuration of the firewalls within the $($AzSubscription.Name) subscription." - foreach ($AzFirewall in $AzFirewallInfo) { - Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzFirewall.Name)" { + if ($InfoLevel.Firewall -ge 2) { + Paragraph "The following sections detail the configuration of the firewalls within the $($AzSubscription.Name) subscription." + foreach ($AzFirewall in $AzFirewallInfo) { + Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzFirewall.Name)" { + $TableParams = @{ + Name = "Firewall - $($AzFirewall.Name)" + List = $true + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzFirewall | Table @TableParams + + # Get NAT Collection Rules + Get-AbrAzFirewallNatRule -Name $AzFirewall.Name + + # Get Network Collection Rules + Get-AbrAzFirewallNetworkRule -Name $AzFirewall.Name + } + } + } else { + Paragraph "The following table summarises the configuration of the firewalls within the $($AzSubscription.Name) subscription." + BlankLine $TableParams = @{ - Name = "Firewall - $($AzFirewall.Name)" - List = $true - ColumnWidths = 50, 50 + Name = "Firewalls - $($AzSubscription.Name)" + List = $false + Headers = 'Name', 'Resource Group', 'Location', 'NAT Rules', 'Network Rules', 'App Rules' + Columns = 'Name', 'Resource Group', 'Location', 'NAT Rule Collections', 'Network Rule Collections', 'Application Rule Collections' + ColumnWidths = 25, 21, 21, 11, 11, 11 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } - $AzFirewall | Table @TableParams - - # Get NAT Collection Rules - Get-AbrAzFirewallNatRule -Name $AzFirewall.Name - - # Get Network Collection Rules - Get-AbrAzFirewallNetworkRule -Name $AzFirewall.Name + $AzFirewallInfo | Table @TableParams } } - } else { - Paragraph "The following table summarises the configuration of the firewalls within the $($AzSubscription.Name) subscription." - BlankLine - $TableParams = @{ - Name = "Firewalls - $($AzSubscription.Name)" - List = $false - Headers = 'Name', 'Resource Group', 'Location', 'NAT Rules', 'Network Rules', 'App Rules' - Columns = 'Name', 'Resource Group', 'Location', 'NAT Rule Collections', 'Network Rule Collections', 'Application Rule Collections' - ColumnWidths = 25, 21, 21, 11, 11, 11 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" - } - $AzFirewallInfo | Table @TableParams } } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzFirewallNatRule.ps1 b/Src/Private/Get-AbrAzFirewallNatRule.ps1 index e5c9a50..e93a87e 100644 --- a/Src/Private/Get-AbrAzFirewallNatRule.ps1 +++ b/Src/Private/Get-AbrAzFirewallNatRule.ps1 @@ -1,7 +1,7 @@ function Get-AbrAzFirewallNatRule { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Firewall NAT Colletion Rule information + Used by As Built Report to retrieve Azure Firewall NAT Colletion Rule information .DESCRIPTION .NOTES @@ -27,75 +27,75 @@ function Get-AbrAzFirewallNatRule { begin {} process { - $AzFirewall = Get-AzFirewall -Name $Name - $NatRuleCollections = $AzFirewall.NatRuleCollections - if ($NatRuleCollections) { - Write-PScriboMessage "Collecting Azure Firewall NAT Rule Collections information." - Section -Style NOTOCHeading6 -ExcludeFromTOC 'NAT Rule Collections' { - $NatRuleCollectionInfo = @() - foreach ($NatRuleCollection in ($NatRuleCollections | Sort-Object Priority)) { - $InObj = [Ordered]@{ - 'Priority' = $NatRuleCollection.Priority - 'Name' = $NatRuleCollection.Name - 'Action' = $NatRuleCollection.Action.Type - 'Rules' = ($NatRuleCollection.Rules).Count + Try { + $AzFirewall = Get-AzFirewall -Name $Name + $NatRuleCollections = $AzFirewall.NatRuleCollections + if ($NatRuleCollections) { + Write-PScriboMessage "Collecting Azure Firewall NAT Rule Collections information." + Section -Style NOTOCHeading6 -ExcludeFromTOC 'NAT Rule Collections' { + $NatRuleCollectionInfo = @() + foreach ($NatRuleCollection in ($NatRuleCollections | Sort-Object Priority)) { + $InObj = [Ordered]@{ + 'Priority' = $NatRuleCollection.Priority + 'Name' = $NatRuleCollection.Name + 'Action' = $NatRuleCollection.Action.Type + 'Rules' = ($NatRuleCollection.Rules).Count + } + $NatRuleCollectionInfo += [PSCustomObject]$InObj } - $NatRuleCollectionInfo += [PSCustomObject]$InObj - } - $TableParams = @{ - Name = "NAT Rule Collections" - List = $false - ColumnWidths = 15, 55, 15, 15 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name) - $($Name)" - } - $NatRuleCollectionInfo | Table @TableParams + $TableParams = @{ + Name = "NAT Rule Collections" + List = $false + ColumnWidths = 15, 55, 15, 15 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name) - $($Name)" + } + $NatRuleCollectionInfo | Table @TableParams - if ($InfoLevel.Firewall -ge 3) { - foreach ($NatRuleCollection in ($NatRuleCollections | Sort-Object Name)) { - Section -Style NOTOCHeading7 -ExcludeFromTOC $($NatRuleCollection.Name) { - $NatRuleInfo = @() - foreach ($NatRule in $($NatRuleCollection.Rules)) { - $InObj = [Ordered]@{ - 'Name' = $NatRule.Name - 'Protocols' = $NatRule.Protocols -join ', ' - 'Source Type' = & { - if ($NatRule.SourceAddresses) { + if ($InfoLevel.Firewall -ge 3) { + foreach ($NatRuleCollection in ($NatRuleCollections | Sort-Object Name)) { + Section -Style NOTOCHeading7 -ExcludeFromTOC $($NatRuleCollection.Name) { + $NatRuleInfo = @() + foreach ($NatRule in $($NatRuleCollection.Rules)) { + $InObj = [Ordered]@{ + 'Name' = $NatRule.Name + 'Protocols' = $NatRule.Protocols -join ', ' + 'Source Type' = if ($NatRule.SourceAddresses) { 'IP Address' } else { 'IP Group' } - } - 'Source' = & { - if ($NatRule.SourceAddresses) { + 'Source' = if ($NatRule.SourceAddresses) { $NatRule.SourceAddresses -join ', ' } elseif ($NatRule.SourceIpGroups) { ($NatRule.SourceIpGroups | ForEach-Object {$_.split('/')[-1]}) -join ', ' } + 'Destination Addresses' = $NatRule.DestinationAddresses -join ', ' + 'Destination Ports' = $NatRule.DestinationPorts -join ', ' + 'Translated Address' = $NatRule.TranslatedAddress + 'Translated Port' = $NatRule.TranslatedPort } - 'Destination Addresses' = $NatRule.DestinationAddresses -join ', ' - 'Destination Ports' = $NatRule.DestinationPorts -join ', ' - 'Translated Address' = $NatRule.TranslatedAddress - 'Translated Port' = $NatRule.TranslatedPort + $NatRuleInfo += [PSCustomObject]$InObj } - $NatRuleInfo += [PSCustomObject]$InObj - } - $TableParams = @{ - Name = "NAT Rule $($NatRuleCollection.Name) - $($Name)" - List = $false - ColumnWidths = 16, 12, 12, 12, 12, 12, 12, 12 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" + $TableParams = @{ + Name = "NAT Rule $($NatRuleCollection.Name) - $($Name)" + List = $false + ColumnWidths = 16, 12, 12, 12, 12, 12, 12, 12 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $NatRuleInfo | Table @TableParams } - $NatRuleInfo | Table @TableParams } } } } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzFirewallNetworkRule.ps1 b/Src/Private/Get-AbrAzFirewallNetworkRule.ps1 index d066063..fb96d1a 100644 --- a/Src/Private/Get-AbrAzFirewallNetworkRule.ps1 +++ b/Src/Private/Get-AbrAzFirewallNetworkRule.ps1 @@ -1,7 +1,7 @@ function Get-AbrAzFirewallNetworkRule { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Firewall Network Collection Rule information + Used by As Built Report to retrieve Azure Firewall Network Collection Rule information .DESCRIPTION .NOTES @@ -27,145 +27,133 @@ function Get-AbrAzFirewallNetworkRule { begin {} process { - $AzFirewall = Get-AzFirewall -Name $Name - $NetworkRuleCollections = $AzFirewall.NetworkRuleCollections - if ($NetworkRuleCollections) { - Write-PScriboMessage "Collecting Azure Firewall Network Rule Collections information." - Section -Style NOTOCHeading5 -ExcludeFromTOC 'Network Rule Collections' { - $NetworkRuleCollectionInfo = @() - foreach ($NetworkRuleCollection in ($NetworkRuleCollections | Sort-Object Priority)) { - $InObj = [Ordered]@{ - 'Priority' = $NetworkRuleCollection.Priority - 'Name' = $NetworkRuleCollection.Name - 'Action' = $NetworkRuleCollection.Action.Type - 'Rules' = ($NetworkRuleCollection.Rules).Count + Try { + $AzFirewall = Get-AzFirewall -Name $Name + $NetworkRuleCollections = $AzFirewall.NetworkRuleCollections + if ($NetworkRuleCollections) { + Write-PScriboMessage "Collecting Azure Firewall Network Rule Collections information." + Section -Style NOTOCHeading5 -ExcludeFromTOC 'Network Rule Collections' { + $NetworkRuleCollectionInfo = @() + foreach ($NetworkRuleCollection in ($NetworkRuleCollections | Sort-Object Priority)) { + $InObj = [Ordered]@{ + 'Priority' = $NetworkRuleCollection.Priority + 'Name' = $NetworkRuleCollection.Name + 'Action' = $NetworkRuleCollection.Action.Type + 'Rules' = ($NetworkRuleCollection.Rules).Count + } + $NetworkRuleCollectionInfo += [PSCustomObject]$InObj } - $NetworkRuleCollectionInfo += [PSCustomObject]$InObj - } - $TableParams = @{ - Name = "Network Rule Collections" - List = $false - ColumnWidths = 15, 55, 15, 15 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name) - $($Name)" - } - $NetworkRuleCollectionInfo | Table @TableParams + $TableParams = @{ + Name = "Network Rule Collections" + List = $false + ColumnWidths = 15, 55, 15, 15 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name) - $($Name)" + } + $NetworkRuleCollectionInfo | Table @TableParams - if ($InfoLevel.Firewall -ge 3) { - foreach ($NetworkRuleCollection in ($NetworkRuleCollections | Sort-Object Name)) { - if ($NetworkRuleCollection.Action.Type -eq 'Allow') { - Section -Style NOTOCHeading6 -ExcludeFromTOC $($NetworkRuleCollection.Name) { - $NetworkAllowRules = $NetworkRuleCollection.Rules | Where-Object {$NetworkRuleCollection.Action.Type -eq 'Allow'} - $AllowRuleInfo = @() - foreach ($AllowRule in $NetworkAllowRules) { - $InObj = [Ordered]@{ - 'Name' = $AllowRule.Name - 'Protocols' = $AllowRule.Protocols -join ', ' - 'Source Type' = & { - if ($AllowRule.SourceAddresses) { + if ($InfoLevel.Firewall -ge 3) { + foreach ($NetworkRuleCollection in ($NetworkRuleCollections | Sort-Object Name)) { + if ($NetworkRuleCollection.Action.Type -eq 'Allow') { + Section -Style NOTOCHeading6 -ExcludeFromTOC $($NetworkRuleCollection.Name) { + $NetworkAllowRules = $NetworkRuleCollection.Rules | Where-Object {$NetworkRuleCollection.Action.Type -eq 'Allow'} + $AllowRuleInfo = @() + foreach ($AllowRule in $NetworkAllowRules) { + $InObj = [Ordered]@{ + 'Name' = $AllowRule.Name + 'Protocols' = $AllowRule.Protocols -join ', ' + 'Source Type' = if ($AllowRule.SourceAddresses) { 'IP Address' } else { 'IP Group' } - } - 'Source' = & { - if ($AllowRule.SourceAddresses) { + 'Source' = if ($AllowRule.SourceAddresses) { $AllowRule.SourceAddresses -join ', ' } elseif ($AllowRule.SourceIpGroups) { ($AllowRule.SourceIpGroups | ForEach-Object {$_.split('/')[-1]}) -join ', ' } - } - 'Destination Type' = & { - if ($AllowRule.DestinationAddresses) { + 'Destination Type' = if ($AllowRule.DestinationAddresses) { 'IP Address' } else { 'IP Group' } - } - 'Destination' = & { - if ($AllowRule.DestinationAddresses) { + 'Destination' = if ($AllowRule.DestinationAddresses) { $AllowRule.DestinationAddresses -join ', ' } elseif ($AllowRule.DestinationIpGroups) { ($AllowRule.DestinationIpGroups | ForEach-Object {$_.split('/')[-1]}) -join ', ' } elseif ($AllowRule.DestinationFqdns) { ($AllowRule.DestinationFqdns | ForEach-Object {$_.split('/')[-1]}) -join ', ' } + 'Destination Ports' = $AllowRule.DestinationPorts -join ', ' } - 'Destination Ports' = $AllowRule.DestinationPorts -join ', ' + $AllowRuleInfo += [PSCustomObject]$InObj } - $AllowRuleInfo += [PSCustomObject]$InObj - } - $TableParams = @{ - Name = "Network Allow Rule $($NetworkRuleCollection.Name) - $($Name)" - List = $false - ColumnWidths = 15, 12, 10, 19, 10, 19, 15 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" + $TableParams = @{ + Name = "Network Allow Rule $($NetworkRuleCollection.Name) - $($Name)" + List = $false + ColumnWidths = 15, 12, 10, 19, 10, 19, 15 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AllowRuleInfo | Table @TableParams } - $AllowRuleInfo | Table @TableParams } - } - if ($NetworkRuleCollection.Action.Type -eq 'Deny') { - Section -Style NOTOCHeading6 -ExcludeFromTOC $($NetworkRuleCollection.Name) { - $NetworkDenyRules = $NetworkRuleCollection.Rules | Where-Object {$NetworkRuleCollection.Action.Type -eq 'Deny'} - $DenyRuleInfo = @() - foreach ($DenyRule in $NetworkDenyRules) { - $InObj = [Ordered]@{ - 'Name' = $DenyRule.Name - 'Protocols' = $DenyRule.Protocols -join ', ' - 'Source Type' = & { - if ($DenyRule.SourceAddresses) { + if ($NetworkRuleCollection.Action.Type -eq 'Deny') { + Section -Style NOTOCHeading6 -ExcludeFromTOC $($NetworkRuleCollection.Name) { + $NetworkDenyRules = $NetworkRuleCollection.Rules | Where-Object {$NetworkRuleCollection.Action.Type -eq 'Deny'} + $DenyRuleInfo = @() + foreach ($DenyRule in $NetworkDenyRules) { + $InObj = [Ordered]@{ + 'Name' = $DenyRule.Name + 'Protocols' = $DenyRule.Protocols -join ', ' + 'Source Type' = if ($DenyRule.SourceAddresses) { 'IP Address' } else { 'IP Group' } - } - 'Source' = & { - if ($DenyRule.SourceAddresses) { + 'Source' = if ($DenyRule.SourceAddresses) { $DenyRule.SourceAddresses -join ', ' } elseif ($DenyRule.SourceIpGroups) { ($DenyRule.SourceIpGroups | ForEach-Object {$_.split('/')[-1]}) -join ', ' } - } - 'Destination Type' = & { - if ($DenyRule.DestinationAddresses) { + 'Destination Type' = if ($DenyRule.DestinationAddresses) { 'IP Address' } else { 'IP Group' } - } - 'Destination' = & { - if ($DenyRule.DestinationAddresses) { + 'Destination' = if ($DenyRule.DestinationAddresses) { $DenyRule.DestinationAddresses -join ', ' } elseif ($DenyRule.DestinationIpGroups) { ($DenyRule.DestinationIpGroups | ForEach-Object {$_.split('/')[-1]}) -join ', ' } elseif ($DenyRule.DestinationFqdns) { ($DenyRule.DestinationFqdns | ForEach-Object {$_.split('/')[-1]}) -join ', ' } + 'Destination Ports' = $DenyRule.DestinationPorts -join ', ' } - 'Destination Ports' = $DenyRule.DestinationPorts -join ', ' + $DenyRuleInfo += [PSCustomObject]$InObj } - $DenyRuleInfo += [PSCustomObject]$InObj - } - $TableParams = @{ - Name = "Network Deny Rule $($NetworkRuleCollection.Name) - $($Name)" - List = $false - ColumnWidths = 15, 12, 10, 19, 10, 19, 15 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" + $TableParams = @{ + Name = "Network Deny Rule $($NetworkRuleCollection.Name) - $($Name)" + List = $false + ColumnWidths = 15, 12, 10, 19, 10, 19, 15 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $DenyRuleInfo | Table @TableParams } - $DenyRuleInfo | Table @TableParams } } } } } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzIpGroup.ps1 b/Src/Private/Get-AbrAzIpGroup.ps1 index 4e1d2ef..275abe3 100644 --- a/Src/Private/Get-AbrAzIpGroup.ps1 +++ b/Src/Private/Get-AbrAzIpGroup.ps1 @@ -1,11 +1,11 @@ function Get-AbrAzIpGroup { <# .SYNOPSIS - Used by As Built Report to retrieve Azure IP Group information + Used by As Built Report to retrieve Azure IP Group information .DESCRIPTION .NOTES - Version: 0.1.0 + Version: 0.1.1 Author: Tim Carman Twitter: @tpcarman Github: tpcarman @@ -23,66 +23,77 @@ function Get-AbrAzIpGroup { } process { - $AzIpGroups = Get-AzIpGroup | Sort-Object Name - if (($InfoLevel.IpGroup -gt 0) -and ($AzIpGroups)) { - Write-PscriboMessage "Collecting Azure IP Group information." - Section -Style Heading4 'IP Groups' { - $AzIpGroupInfo = @() - foreach ($AzIpGroup in $AzIpGroups) { - $InObj = [Ordered]@{ - 'Name' = $AzIpGroup.Name - 'Resource Group' = $AzIpGroup.ResourceGroupName - 'Location' = $AzLocationLookup."$($AzIpGroup.Location)" - 'Subscription' = "$($AzSubscriptionLookup.(($AzIpGroup.Id).split('/')[2]))" - 'Provisioning State' = $AzIpGroup.ProvisioningState - 'Firewalls' = & { - if ($AzIpGroup.Firewalls.id) { - ($AzIpGroup.Firewalls.id | ForEach-Object {$_.split('/')[-1]}) -join ', ' - } else { - 'None' + Try { + if ($InfoLevel.IpGroup -gt 0) { + $AzIpGroups = Get-AzIpGroup | Sort-Object Name + if ($AzIpGroups) { + Write-PScriboMessage "Collecting Azure IP Group information." + Section -Style Heading4 'IP Groups' { + $AzIpGroupInfo = @() + foreach ($AzIpGroup in $AzIpGroups) { + $InObj = [Ordered]@{ + 'Name' = $AzIpGroup.Name + 'Resource Group' = $AzIpGroup.ResourceGroupName + 'Location' = $AzLocationLookup."$($AzIpGroup.Location)" + 'Subscription' = "$($AzSubscriptionLookup.(($AzIpGroup.Id).split('/')[2]))" + 'Provisioning State' = $AzIpGroup.ProvisioningState + 'Firewalls' = if ($AzIpGroup.Firewalls.id) { + ($AzIpGroup.Firewalls.id | ForEach-Object { $_.split('/')[-1] }) -join ', ' + } else { + 'None' + } + 'IP Addresses' = if ($AzIpGroup.IpAddresses) { + $AzIpGroup.IpAddresses -join ', ' + } else { + 'None' + } } - } - 'IP Addresses' = & { - if ($AzIpGroup.IpAddresses) { - $AzIpGroup.IpAddresses -join ', ' - } else { - 'None' + + if ($Options.ShowTags) { + $InObj['Tags'] = if ([string]::IsNullOrEmpty($AzIpGroup.Tag)) { + 'None' + } else { + ($AzIpGroup.Tag.GetEnumerator() | ForEach-Object { "$($_.Name):`t$($_.Value)" }) -join [Environment]::NewLine + } } + + $AzIpGroupInfo += [PSCustomObject]$InObj } - } - $AzIpGroupInfo += [PSCustomObject]$InObj - } - if ($InfoLevel.IPGroup -ge 2) { - Paragraph "The following sections detail the configuration of the IP groups within the $($AzSubscription.Name) subscription." - foreach ($AzIpGroup in $AzIpGroupInfo) { - Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzIpGroup.Name)" { + if ($InfoLevel.IPGroup -ge 2) { + Paragraph "The following sections detail the configuration of the IP groups within the $($AzSubscription.Name) subscription." + foreach ($AzIpGroup in $AzIpGroupInfo) { + Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzIpGroup.Name)" { + $TableParams = @{ + Name = "IP Group - $($AzIpGroup.Name)" + List = $true + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzIpGroup | Table @TableParams + } + } + } else { + Paragraph "The following table summarises the configuration of the IP groups within the $($AzSubscription.Name) subscription." + BlankLine $TableParams = @{ - Name = "IP Group - $($AzIpGroup.Name)" - List = $true - ColumnWidths = 50, 50 + Name = "IP Groups - $($AzSubscription.Name)" + List = $false + Columns = 'Name', 'Resource Group', 'Location', 'IP Addresses' + ColumnWidths = 25, 25, 25, 25 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } - $AzIpGroup | Table @TableParams + $AzIpGroupInfo | Table @TableParams } } - } else { - Paragraph "The following table summarises the configuration of the IP groups within the $($AzSubscription.Name) subscription." - BlankLine - $TableParams = @{ - Name = "IP Groups - $($AzSubscription.Name)" - List = $false - Columns = 'Name', 'Resource Group', 'Location', 'IP Addresses' - ColumnWidths = 25, 25, 25, 25 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" - } - $AzIpGroupInfo | Table @TableParams } } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzKeyVault.ps1 b/Src/Private/Get-AbrAzKeyVault.ps1 index 94846f2..a694d1a 100644 --- a/Src/Private/Get-AbrAzKeyVault.ps1 +++ b/Src/Private/Get-AbrAzKeyVault.ps1 @@ -1,7 +1,7 @@ function Get-AbrAzKeyVault { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Key Vault information + Used by As Built Report to retrieve Azure Key Vault information .DESCRIPTION .NOTES @@ -23,65 +23,107 @@ function Get-AbrAzKeyVault { } process { - $AzKeyVaults = Get-AzKeyVault | Sort-Object VaultName - if (($InfoLevel.KeyVault -gt 0) -and ($AzKeyVaults)) { - Write-PscriboMessage "Collecting Azure Key Vault information." - Section -Style Heading4 'Key Vaults' { - if ($Options.ShowSectionInfo) { - Paragraph "Azure Key Vault is a key management solution which enables Azure users and applications to securely store and access keys, secrets, and certificates." - BlankLine - } - Paragraph "The following table summarises the configuration of the key vaults within the $($AzSubscription.Name) subscription." - BlankLine - $AzKeyVaultInfo = @() - foreach ($AzKeyVault in $AzKeyVaults) { - $InObj = [Ordered]@{ - 'Name' = $AzKeyVault.VaultName - 'Resource Group' = $AzKeyVault.ResourceGroupName - 'Location' = $AzLocationLookup."$($AzKeyVault.Location)" - 'Subscription' = "$($AzSubscriptionLookup.(($AzKeyVault.ResourceId).split('/')[2]))" - } - $AzKeyVaultInfo += [PSCustomObject]$InObj - } + Try { + if ($InfoLevel.KeyVault -gt 0) { + $AzKeyVaults = Get-AzKeyVault | Sort-Object VaultName + if ($AzKeyVaults) { + Write-PscriboMessage "Collecting Azure Key Vault information." + Section -Style Heading4 'Key Vaults' { + if ($Options.ShowSectionInfo) { + Paragraph "Azure Key Vault is a key management solution which enables Azure users and applications to securely store and access keys, secrets, and certificates." + BlankLine + } + Paragraph "The following table summarises the configuration of the key vaults within the $($AzSubscription.Name) subscription." + BlankLine + $AzKeyVaultInfo = @() + foreach ($AzKeyVault in $AzKeyVaults) { + $AzKeyVault = Get-AzKeyVault -Name $AzKeyVault.VaultName + $AzKeyVaultResourceAccess = @() + if ($AzKeyVault.EnabledForDeployment) { + $AzKeyVaultResourceAccess += 'Azure Virtual Machines for Deployment' + } + if ($AzKeyVault.EnabledForTemplateDeployment) { + $AzKeyVaultResourceAccess += 'Azure Resource Manager for Template Deployment' + } + if ($AzKeyVault.EnabledForDiskEncryption) { + $AzKeyVaultResourceAccess += 'Azure Disk Encryption for Volume Encryption' + } + $InObj = [Ordered]@{ + 'Name' = $AzKeyVault.VaultName + 'Resource Group' = $AzKeyVault.ResourceGroupName + 'Location' = $AzLocationLookup."$($AzKeyVault.Location)" + 'Subscription' = "$($AzSubscriptionLookup.(($AzKeyVault.ResourceId).split('/')[2]))" + 'Vault URI' = $AzKeyVault.VaultUri + 'Sku (Pricing Tier)' = $AzKeyVault.SKU + 'Resource Access' = if ($AzKeyVaultResourceAccess) { + $AzKeyVaultResourceAccess + } else { + 'No access enabled' + } + 'RBAC Authorization' = if ($AzKeyVault.EnableRbacAuthorization) { + 'Enabled' + } else { + 'Disabled' + } + 'Soft Delete' = if ($AzKeyVault.EnableSoftDelete) { + "Enabled ($($AzKeyVault.SoftDeleteRetentionInDays) days)" + } else { + 'Disabled' + } + 'Purge Protection' = if ($AzKeyVault.EnablePurgeProtection) { + 'Enabled' + } else { + 'Disabled' + } + 'Public Network Access' = if ($AzKeyVault.PublicNetworkAccess) { + 'Enabled' + } else { + 'Disabled' + } + } - <# - ##TODO: More info required use `Get-AzKeyVault -VaultName xxxx` to get more properties - SKU - Enabled for RBAC - Enabled for Disk Encryption - Enabled for Template Deployment - Soft Delete Enabled - Soft Delete Retention Period (days) - Purge Protection + if ($Options.ShowTags) { + $InObj['Tags'] = if ([string]::IsNullOrEmpty($AzKeyVault.Tags)) { + 'None' + } else { + ($AzKeyVault.Tags.GetEnumerator() | ForEach-Object { "$($_.Key):`t$($_.Value)" }) -join [Environment]::NewLine + } + } + + $AzKeyVaultInfo += [PSCustomObject]$InObj + } - if ($InfoLevel.KeyVault -ge 2) { - foreach ($AzKeyVault in $AzKeyVaultInfo) { - Section -Style Heading4 -ExcludeFromTOC "$($AzKeyVault.Name)" { + if ($InfoLevel.KeyVault -ge 2) { + foreach ($AzKeyVault in $AzKeyVaultInfo) { + Section -Style Heading4 -ExcludeFromTOC "$($AzKeyVault.Name)" { + $TableParams = @{ + Name = "Key Vault - $($AzKeyVault.Name)" + List = $true + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzKeyVault | Table @TableParams + } + } + } else { $TableParams = @{ - Name = "Key Vault - $($AzKeyVault.Name)" - List = $true - ColumnWidths = 50, 50 + Name = "Key Vaults - $($AzSubscription.Name)" + List = $false + Columns = 'Name', 'Resource Group', 'Location' + ColumnWidths = 33, 34, 33 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } - $AzKeyVault | Table @TableParams + $AzKeyVaultInfo | Table @TableParams } } - } else { - #> - $TableParams = @{ - Name = "Key Vaults - $($AzSubscription.Name)" - List = $false - Columns = 'Name', 'Resource Group', 'Location' - ColumnWidths = 33, 34, 33 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" - } - $AzKeyVaultInfo | Table @TableParams - #} + } } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzLbBackendPool.ps1 b/Src/Private/Get-AbrAzLbBackendPool.ps1 index d8a8104..fed3cc6 100644 --- a/Src/Private/Get-AbrAzLbBackendPool.ps1 +++ b/Src/Private/Get-AbrAzLbBackendPool.ps1 @@ -1,7 +1,7 @@ function Get-AbrAzLbBackendPool { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Load Balancer Backend Pool information + Used by As Built Report to retrieve Azure Load Balancer Backend Pool information .DESCRIPTION .NOTES @@ -27,34 +27,36 @@ function Get-AbrAzLbBackendPool { begin {} process { - $AzLbBackendPools = (Get-AzLoadBalancer -Name $Name).BackendAddressPools | Sort-Object Name - if ($AzLbBackendPools) { - Write-PscriboMessage "Collecting Azure Load Balancer Backend Pool information." - Section -Style NOTOCHeading6 -ExcludeFromTOC 'Backend Pools' { - $AzLbBackendPoolInfo = @() - foreach ($AzLbBackendPool in $AzLbBackendPools) { - $InObj = [Ordered]@{ - 'Name' = $AzLbBackendPool.Name - 'Load Balancing Rules' = & { - if ($AzLbBackendPool.LoadBalancingRules.Id) { + Try { + $AzLbBackendPools = (Get-AzLoadBalancer -Name $Name).BackendAddressPools | Sort-Object Name + if ($AzLbBackendPools) { + Write-PscriboMessage "Collecting Azure Load Balancer Backend Pool information." + Section -Style NOTOCHeading6 -ExcludeFromTOC 'Backend Pools' { + $AzLbBackendPoolInfo = @() + foreach ($AzLbBackendPool in $AzLbBackendPools) { + $InObj = [Ordered]@{ + 'Name' = $AzLbBackendPool.Name + 'Load Balancing Rules' = if ($AzLbBackendPool.LoadBalancingRules.Id) { ($AzLbBackendPool.LoadBalancingRules.Id | ForEach-Object {$_.split('/')[-1]}) -join ', ' } else { 'None' } } + $AzLbBackendPoolInfo = [PSCustomObject]$InObj } - $AzLbBackendPoolInfo = [PSCustomObject]$InObj - } - $TableParams = @{ - Name = "Backend Pools - $($Name)" - List = $false - ColumnWidths = 50, 50 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" + $TableParams = @{ + Name = "Backend Pools - $($Name)" + List = $false + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzLbBackendPoolInfo | Table @TableParams } - $AzLbBackendPoolInfo | Table @TableParams } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzLbFrontendIpConfig.ps1 b/Src/Private/Get-AbrAzLbFrontendIpConfig.ps1 index 4bcfd94..471f638 100644 --- a/Src/Private/Get-AbrAzLbFrontendIpConfig.ps1 +++ b/Src/Private/Get-AbrAzLbFrontendIpConfig.ps1 @@ -1,11 +1,11 @@ function Get-AbrAzLbFrontendIpConfig { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Load Balancer Frontend IP Configuration information + Used by As Built Report to retrieve Azure Load Balancer Frontend IP Configuration information .DESCRIPTION .NOTES - Version: 0.1.0 + Version: 0.1.1 Author: Tim Carman Twitter: @tpcarman Github: tpcarman @@ -27,54 +27,64 @@ function Get-AbrAzLbFrontendIpConfig { begin {} process { - $AzLbFrontendIpConfigs = (Get-AzLoadBalancer -Name $Name).FrontendIpConfigurations | Sort-Object Name - if ($AzLbFrontendIpConfigs) { - Write-PscriboMessage "Collecting Azure Load Balancer Frontend IP Configuration information." - Section -Style NOTOCHeading6 -ExcludeFromTOC 'Frontend IP Configuration' { - foreach ($AzLbFrontendIpConfig in $AzLbFrontendIpConfigs) { - Section -Style NOTOCHeading7 -ExcludeFromTOC $($AzLbFrontendIpConfig.Name) { - $AzLbFrontendIpConfigInfo = @() - $InObj = [Ordered]@{ - 'Name' = $AzLbFrontendIpConfig.Name - 'Private IP Address' = Switch ($AzLbFrontendIpConfig.PrivateIpAddress) { - $null { '--' } - default { $AzLbFrontendIpConfig.PrivateIpAddress } + Try { + $AzLbFrontendIpConfigs = (Get-AzLoadBalancer -Name $Name).FrontendIpConfigurations | Sort-Object Name + if ($AzLbFrontendIpConfigs) { + Write-PscriboMessage "Collecting Azure Load Balancer Frontend IP Configuration information." + Section -Style NOTOCHeading6 -ExcludeFromTOC 'Frontend IP Configuration' { + foreach ($AzLbFrontendIpConfig in $AzLbFrontendIpConfigs) { + Section -Style NOTOCHeading7 -ExcludeFromTOC $($AzLbFrontendIpConfig.Name) { + $AzLbFrontendIpConfigInfo = @() + $InObj = [Ordered]@{ + 'Name' = $AzLbFrontendIpConfig.Name + 'Private IP Address' = if ($AzLbFrontendIpConfig.PrivateIpAddress) { + $AzLbFrontendIpConfig.PrivateIpAddress + } else { + 'None' + } + 'Private IP Allocation Method' = if ($AzLbFrontendIpConfig.PrivateIpAllocationMethod) { + $AzLbFrontendIpConfig.PrivateIpAllocationMethod + } else { + 'Unknown' + } + 'Public IP Address' = if ($AzLbFrontendIpConfig.PublicIpAddress) { + $AzLbFrontendIpConfig.PublicIpAddress + } else { + 'None' + } + 'Subnet' = iCloudFirefox.exe ($AzLbFrontendIpConfig.Subnet.Id) { + ($AzLbFrontendIpConfig.Subnet.Id).split('/')[-1] + } else { + 'None' + } + 'Load Balancing Rules' = if ($AzLbFrontendIpConfig.LoadBalancingRules.Id) { + ($AzLbFrontendIpConfig.LoadBalancingRules.Id).split('/')[-1] + } else { + 'None' + } + 'Inbound NAT Rules' = if ($AzLbFrontendIpConfig.InboundNatRules.Id) { + ($AzLbFrontendIpConfig.InboundNatRules.Id).split('/')[-1] + } else { + 'None' + } } - 'Private IP Allocation Method' = Switch ($AzLbFrontendIpConfig.PrivateIpAllocationMethod) { - $null { '--' } - default { $AzLbFrontendIpConfig.PrivateIpAllocationMethod } - } - 'Public IP Address' = Switch ($AzLbFrontendIpConfig.PublicIpAddress) { - $null { '--' } - default { $AzLbFrontendIpConfig.PublicIpAddress } - } - 'Subnet' = Switch ($AzLbFrontendIpConfig.Subnet.Id) { - $null { '--' } - default { ($AzLbFrontendIpConfig.Subnet.Id).split('/')[-1] } - } - 'Load Balancing Rules' = Switch ($AzLbFrontendIpConfig.LoadBalancingRules.Id) { - $null { 'None' } - default { ($AzLbFrontendIpConfig.LoadBalancingRules.Id).split('/')[-1] } + $AzLbFrontendIpConfigInfo += [PSCustomObject]$InObj + + $TableParams = @{ + Name = "Frontend IP Configuration - $($AzLbFrontendIpConfig.Name)" + List = $true + ColumnWidths = 40, 60 } - 'Inbound NAT Rules' = Switch ($AzLbFrontendIpConfig.InboundNatRules.Id) { - $null { 'None' } - default { ($AzLbFrontendIpConfig.InboundNatRules.Id).split('/')[-1] } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" } + $AzLbFrontendIpConfigInfo | Table @TableParams } - $AzLbFrontendIpConfigInfo += [PSCustomObject]$InObj - - $TableParams = @{ - Name = "Frontend IP Configuration - $($AzLbFrontendIpConfig.Name)" - List = $true - ColumnWidths = 50, 50 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" - } - $AzLbFrontendIpConfigInfo | Table @TableParams } } } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzLbHealthProbe.ps1 b/Src/Private/Get-AbrAzLbHealthProbe.ps1 index e964666..e6e8a5e 100644 --- a/Src/Private/Get-AbrAzLbHealthProbe.ps1 +++ b/Src/Private/Get-AbrAzLbHealthProbe.ps1 @@ -1,7 +1,7 @@ function Get-AbrAzLbHealthProbe { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Load Balancer Health Probe information + Used by As Built Report to retrieve Azure Load Balancer Health Probe information .DESCRIPTION .NOTES @@ -27,37 +27,41 @@ function Get-AbrAzLbHealthProbe { begin {} process { - $AzLbHealthProbes = (Get-AzLoadBalancer -Name $Name).Probes | Sort-Object Name - if ($AzLbHealthProbes) { - Write-PscriboMessage "Collecting Azure Load Balancer Health Probe information." - Section -Style NOTOCHeading6 -ExcludeFromTOC 'Health Probes' { - $AzLbHealthProbeInfo = @() - foreach ($AzLbHealthProbe in $AzLbHealthProbes) { - $InObj = [Ordered]@{ - 'Name' = $AzLbHealthProbe.Name - 'Protocol' = $AzLbHealthProbe.Protocol - 'Port' = $AzLbHealthProbe.Port - 'Interval' = "$($AzLbHealthProbe.IntervalInSeconds) secs" - 'Used By' = & { - if ($AzLbHealthProbe.LoadBalancingRules.Id) { - ($AzLbHealthProbe.LoadBalancingRules.Id | ForEach-Object {$_.split('/')[-1]}) -join ', ' - } else { - '--' + Try { + $AzLbHealthProbes = (Get-AzLoadBalancer -Name $Name).Probes | Sort-Object Name + if ($AzLbHealthProbes) { + Write-PscriboMessage "Collecting Azure Load Balancer Health Probe information." + Section -Style NOTOCHeading6 -ExcludeFromTOC 'Health Probes' { + $AzLbHealthProbeInfo = @() + foreach ($AzLbHealthProbe in $AzLbHealthProbes) { + $InObj = [Ordered]@{ + 'Name' = $AzLbHealthProbe.Name + 'Protocol' = $AzLbHealthProbe.Protocol + 'Port' = $AzLbHealthProbe.Port + 'Interval' = "$($AzLbHealthProbe.IntervalInSeconds) secs" + 'Used By' = & { + if ($AzLbHealthProbe.LoadBalancingRules.Id) { + ($AzLbHealthProbe.LoadBalancingRules.Id | ForEach-Object {$_.split('/')[-1]}) -join ', ' + } else { + '--' + } } } + $AzLbHealthProbeInfo += [PSCustomObject]$InObj } - $AzLbHealthProbeInfo += [PSCustomObject]$InObj - } - $TableParams = @{ - Name = "Health Probes - $($Name)" - List = $false - ColumnWidths = 20, 20, 20, 20, 20 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" + $TableParams = @{ + Name = "Health Probes - $($Name)" + List = $false + ColumnWidths = 20, 20, 20, 20, 20 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzLbHealthProbeInfo | Table @TableParams } - $AzLbHealthProbeInfo | Table @TableParams } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzLbInboundNatPool.ps1 b/Src/Private/Get-AbrAzLbInboundNatPool.ps1 index 1160273..87733cd 100644 --- a/Src/Private/Get-AbrAzLbInboundNatPool.ps1 +++ b/Src/Private/Get-AbrAzLbInboundNatPool.ps1 @@ -1,7 +1,7 @@ function Get-AbrAzLbInboundNatPool { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Load Balancer Inbound NAT Pool information + Used by As Built Report to retrieve Azure Load Balancer Inbound NAT Pool information .DESCRIPTION .NOTES @@ -27,27 +27,31 @@ function Get-AbrAzLbInboundNatPool { begin {} process { - $AzLbInboundNatPools = (Get-AzLoadBalancer -Name $Name).InboundNatPools | Sort-Object Name - if ($AzLbInboundNatPools) { - Write-PscriboMessage "Collecting Azure Load Balancer Inbound NAT Pool information." - Section -Style NOTOCHeading6 -ExcludeFromTOC 'Inbound NAT Pools' { - $AzLbInboundNatPoolInfo = @() - foreach ($AzLbInboundNatPool in $AzLbInboundNatPools) { - $InObj = [Ordered]@{ - 'Name' = $AzLbInboundNatPool.Name + try { + $AzLbInboundNatPools = (Get-AzLoadBalancer -Name $Name).InboundNatPools | Sort-Object Name + if ($AzLbInboundNatPools) { + Write-PscriboMessage "Collecting Azure Load Balancer Inbound NAT Pool information." + Section -Style NOTOCHeading6 -ExcludeFromTOC 'Inbound NAT Pools' { + $AzLbInboundNatPoolInfo = @() + foreach ($AzLbInboundNatPool in $AzLbInboundNatPools) { + $InObj = [Ordered]@{ + 'Name' = $AzLbInboundNatPool.Name + } + $AzLbInboundNatPoolInfo += [PSCustomObject]$InObj } - $AzLbInboundNatPoolInfo += [PSCustomObject]$InObj - } - $TableParams = @{ - Name = "Inbound NAT Pools - $($Name)" - List = $false - ColumnWidths = 50, 50 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" + $TableParams = @{ + Name = "Inbound NAT Pools - $($Name)" + List = $false + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzLbInboundNatPoolInfo | Table @TableParams } - $AzLbInboundNatPoolInfo | Table @TableParams } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzLbLoadBalancingRule.ps1 b/Src/Private/Get-AbrAzLbLoadBalancingRule.ps1 index a2e3d0e..145f253 100644 --- a/Src/Private/Get-AbrAzLbLoadBalancingRule.ps1 +++ b/Src/Private/Get-AbrAzLbLoadBalancingRule.ps1 @@ -1,7 +1,7 @@ function Get-AbrAzLbLoadBalancingRule { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Load Balancer Load Balancing Rules information + Used by As Built Report to retrieve Azure Load Balancer Load Balancing Rules information .DESCRIPTION .NOTES @@ -27,41 +27,46 @@ function Get-AbrAzLbLoadBalancingRule { begin {} process { - $AzLbLoadBalancingRules = (Get-AzLoadBalancer -Name $Name).LoadBalancingRules | Sort-Object Name - if ($AzLbLoadBalancingRules) { - Write-PscriboMessage "Collecting Azure Load Balancer Load Balancing Rules information." - Section -Style NOTOCHeading6 -ExcludeFromTOC 'Load Balancing Rules' { - foreach ($AzLbLoadBalancingRule in $AzLbLoadBalancingRules) { - Section -Style NOTOCHeading7 -ExcludeFromTOC $($AzLbLoadBalancingRule.Name) { - $AzLbLoadBalancingRuleInfo = @() - $InObj = [Ordered]@{ - 'Name' = $AzLbLoadBalancingRule.Name - 'Frontend IP Address' = ($AzLbLoadBalancingRule.FrontendIPConfiguration.Id).split('/')[-1] - 'Backend Pool' = ($AzLbLoadBalancingRule.BackendAddressPool.Id).split('/')[-1] - 'Protocol' = $AzLbLoadBalancingRule.Protocol - 'Port' = $AzLbLoadBalancingRule.FrontendPort - 'Backend Port' = $AzLbLoadBalancingRule.BackendPort - 'Health Probe' = ($AzLbLoadBalancingRule.Probe.Id).split('/')[-1] - 'Idle Timeout' = "$($AzLbLoadBalancingRule.IdleTimeoutInMinutes) mins" - 'Floating IP' = Switch ($AzLbLoadBalancingRule.EnableFloatingIP) { - $true { 'Enabled' } - $false { 'Disabled' } + Try { + $AzLbLoadBalancingRules = (Get-AzLoadBalancer -Name $Name).LoadBalancingRules | Sort-Object Name + if ($AzLbLoadBalancingRules) { + Write-PscriboMessage "Collecting Azure Load Balancer Load Balancing Rules information." + Section -Style NOTOCHeading6 -ExcludeFromTOC 'Load Balancing Rules' { + foreach ($AzLbLoadBalancingRule in $AzLbLoadBalancingRules) { + Section -Style NOTOCHeading7 -ExcludeFromTOC $($AzLbLoadBalancingRule.Name) { + $AzLbLoadBalancingRuleInfo = @() + $InObj = [Ordered]@{ + 'Name' = $AzLbLoadBalancingRule.Name + 'Frontend IP Address' = ($AzLbLoadBalancingRule.FrontendIPConfiguration.Id).split('/')[-1] + 'Backend Pool' = ($AzLbLoadBalancingRule.BackendAddressPool.Id).split('/')[-1] + 'Protocol' = $AzLbLoadBalancingRule.Protocol + 'Port' = $AzLbLoadBalancingRule.FrontendPort + 'Backend Port' = $AzLbLoadBalancingRule.BackendPort + 'Health Probe' = ($AzLbLoadBalancingRule.Probe.Id).split('/')[-1] + 'Idle Timeout' = "$($AzLbLoadBalancingRule.IdleTimeoutInMinutes) mins" + 'Floating IP' = if ($AzLbLoadBalancingRule.EnableFloatingIP) { + 'Enabled' + } else { + 'Disabled' + } } - } - $AzLbLoadBalancingRuleInfo += [PSCustomObject]$InObj + $AzLbLoadBalancingRuleInfo += [PSCustomObject]$InObj - $TableParams = @{ - Name = "Load Balancing Rule - $($AzLbLoadBalancingRule.Name)" - List = $true - ColumnWidths = 50, 50 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" + $TableParams = @{ + Name = "Load Balancing Rule - $($AzLbLoadBalancingRule.Name)" + List = $true + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzLbLoadBalancingRuleInfo | Table @TableParams } - $AzLbLoadBalancingRuleInfo | Table @TableParams } } } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzLoadBalancer.ps1 b/Src/Private/Get-AbrAzLoadBalancer.ps1 index ca66ace..6d39f7d 100644 --- a/Src/Private/Get-AbrAzLoadBalancer.ps1 +++ b/Src/Private/Get-AbrAzLoadBalancer.ps1 @@ -1,11 +1,11 @@ function Get-AbrAzLoadBalancer { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Load Balancer information + Used by As Built Report to retrieve Azure Load Balancer information .DESCRIPTION .NOTES - Version: 0.1.1 + Version: 0.1.2 Author: Tim Carman Twitter: @tpcarman Github: tpcarman @@ -23,81 +23,96 @@ function Get-AbrAzLoadBalancer { } process { - $AzLoadBalancers = Get-AzLoadBalancer | Sort-Object Name - if (($InfoLevel.LoadBalancer -gt 0) -and ($AzLoadBalancers)) { - Write-PscriboMessage "Collecting Azure Load Balancer information." - Section -Style Heading4 'Load Balancers' { - if ($Options.ShowSectionInfo) { - Paragraph "Azure Load Balancer operates at layer 4 of the Open Systems Interconnection (OSI) model. It's the single point of contact for clients. Load balancer distributes inbound flows that arrive at the load balancer's front end to backend pool instances. These flows are according to configured load-balancing rules and health probes. The backend pool instances can be Azure Virtual Machines or instances in a Virtual Machine Scale Set." - BlankLine - Paragraph "A public load balancer can provide outbound connections for virtual machines (VMs) inside your virtual network. These connections are accomplished by translating their private IP addresses to public IP addresses. Public Load Balancers are used to load balance internet traffic to your VMs." - BlankLine - Paragraph "An internal (or private) load balancer is used where private IPs are needed at the frontend only. Internal load balancers are used to load balance traffic inside a virtual network. A load balancer frontend can be accessed from an on-premises network in a hybrid scenario." - BlankLine - Try { - Image -Text 'Load Balancer' -Align 'Center' -Percent 35 -Base64 "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OwAijM1m27Rp049//GO73f7ggw9+9NFHM7GZLhBZKioqZG199913qa0AoBZCMSCMWCyW/v5+h8OhdkcAT8rYvbq6mrE7AN+dPXv26aeflksmy8vL9+7dy+pIQKqoqDCZTIODg9RWAFALoRgQRlpaWtrb2/v6+tTuCDCBsrKy3Nxcxu4AfPfee+8988wz165dy87O/uCDD8rLy9XuERBeKioqlNra29urdncAIKo0NzcfPHjw4sWLXtoQigEAfKLVardt2ybH7rW1tQMDA2r3CED4stlsZWVlNTU1QohHHnnkwIEDixYtUrtTQNhxr63bt2+ntgJAiBGKAQB8Jcfuc+fOvXz5cnV1NWN3ABM6fvz4448/fuLECZ1OV1VV5fGUSQDuZG1NS0ujtgJA6PF4eADANGi12i1btlRXV8ux+86dO9XuEaLcV3bnV3an2r2YhvlzEtKS49TuhZp27969e/duIcTChQu3bt3KBDFgSjIXk7V1+/bt27ZtU7tHQDBFXCm/dx45SQzhhw2EEbPZ3NfXZzQa1e4I4E1eXp4ydq+rq6uoqFC7R4haX9mdPzpoG7rtUrsj0zB/TsIrj+piMxfr7u7etGnTuXPnhBDr1q3bvHkzE8QAHym19fTp09RWRJMz10ff+Niudi+m596sxFce06ndCwRBUVGRVqvNzs720oblkwCAacvLy9uyZYsQoqmpqa6uTu3uIGq1XLgdWYmYEOIPN8b+cGNM7V6o4JNPPnn66afPnTun0+neeuutrVu3kogB05KXl1dZWSmorYguH3c41O7CtJ3pGY3NUh59DAZDRkaGRqPx0oZQDADgjyVLlsj72E1NTfv371e7OwBUY7PZampqXnrpJbvdvnDhwgMHDqxevVrtTgERyWQyKbX14MGDancHCILBSLu5JUVot+EHQjEgjFgslv7+focj8m6nIDYVFxfLsfv+/fubmprU7g4AFZw9e7asrOy9994TQjz33HMHDhxgEwAgEEpt3bt3L7UVAGYae4oBYaSlpUUIkZuby18UiBTFxcWXLl06ePCgXOhRXFysdo8AhM6HH364Y8cOu92u0+l27ty5bNkytXsERIPi4uJTp04piyiprQDgn+bmZiGE0WjMz8+frA0zxQAAASkrK5Pj9bq6ukuXLqndHQChYLPZNm3a9OMf/9hutz/44IMfffQRiRgQRBUV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" - BlankLine - } Catch { - Write-PScriboMessage -IsWarning "Unable to display Load Balancer image." - } - } - $AzLoadBalancerInfo = @() - foreach ($AzLoadBalancer in $AzLoadBalancers) { - $InObj = [Ordered]@{ - 'Name' = $AzLoadBalancer.Name - 'Resource Group' = $AzLoadBalancer.ResourceGroupName - 'Location' = $AzLocationLookup."$($AzLoadBalancer.Location)" - 'Subscription' = "$($AzSubscriptionLookup.(($AzLoadBalancer.Id).split('/')[2]))" - 'Provisioning State' = $AzLoadBalancer.ProvisioningState - 'SKU' = $AzLoadBalancer.Sku.Name - 'Tier' = $AzLoadBalancer.Sku.Tier - ##ToDo: NAT Rules - } - $AzLoadBalancerInfo += [PSCustomObject]$InObj - } - - if ($InfoLevel.LoadBalancer -ge 2) { - Paragraph "The following sections detail the configuration of the load balancers within the $($AzSubscription.Name) subscription." - foreach ($AzLoadBalancer in $AzLoadBalancerInfo) { - Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzLoadBalancer.Name)" { - $TableParams = @{ - Name = "Load Balancer - $($AzLoadBalancer.Name)" - List = $true - ColumnWidths = 50, 50 + Try { + if ($InfoLevel.LoadBalancer -gt 0) { + $AzLoadBalancers = Get-AzLoadBalancer | Sort-Object Name + if ($AzLoadBalancers) { + Write-PScriboMessage "Collecting Azure Load Balancer information." + Section -Style Heading4 'Load Balancers' { + if ($Options.ShowSectionInfo) { + Paragraph "Azure Load Balancer operates at layer 4 of the Open Systems Interconnection (OSI) model. It's the single point of contact for clients. Load balancer distributes inbound flows that arrive at the load balancer's front end to backend pool instances. These flows are according to configured load-balancing rules and health probes. The backend pool instances can be Azure Virtual Machines or instances in a Virtual Machine Scale Set." + BlankLine + Paragraph "A public load balancer can provide outbound connections for virtual machines (VMs) inside your virtual network. These connections are accomplished by translating their private IP addresses to public IP addresses. Public Load Balancers are used to load balance internet traffic to your VMs." + BlankLine + Paragraph "An internal (or private) load balancer is used where private IPs are needed at the frontend only. Internal load balancers are used to load balance traffic inside a virtual network. A load balancer frontend can be accessed from an on-premises network in a hybrid scenario." + BlankLine + Try { + Image -Text 'Load Balancer' -Align 'Center' -Percent 35 -Base64 "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OwAijM1m27Rp049//GO73f7ggw9+9NFHM7GZLhBZKioqZG199913qa0AoBZCMSCMWCyW/v5+h8OhdkcAT8rYvbq6mrE7AN+dPXv26aeflksmy8vL9+7dy+pIQKqoqDCZTIODg9RWAFALoRgQRlpaWtrb2/v6+tTuCDCBsrKy3Nxcxu4AfPfee+8988wz165dy87O/uCDD8rLy9XuERBeKioqlNra29urdncAIKo0NzcfPHjw4sWLXtoQigEAfKLVardt2ybH7rW1tQMDA2r3CED4stlsZWVlNTU1QohHHnnkwIEDixYtUrtTQNhxr63bt2+ntgJAiBGKAQB8Jcfuc+fOvXz5cnV1NWN3ABM6fvz4448/fuLECZ1OV1VV5fGUSQDuZG1NS0ujtgJA6PF4eADANGi12i1btlRXV8ux+86dO9XuEaLcV3bnV3an2r2YhvlzEtKS49TuhZp27969e/duIcTChQu3bt3KBDFgSjIXk7V1+/bt27ZtU7tHQDBFXCm/dx45SQzhhw2EEbPZ3NfXZzQa1e4I4E1eXp4ydq+rq6uoqFC7R4haX9mdPzpoG7rtUrsj0zB/TsIrj+piMxfr7u7etGnTuXPnhBDr1q3bvHkzE8QAHym19fTp09RWRJMz10ff+Niudi+m596sxFce06ndCwRBUVGRVqvNzs720oblkwCAacvLy9uyZYsQoqmpqa6uTu3uIGq1XLgdWYmYEOIPN8b+cGNM7V6o4JNPPnn66afPnTun0+neeuutrVu3kogB05KXl1dZWSmorYguH3c41O7CtJ3pGY3NUh59DAZDRkaGRqPx0oZQDADgjyVLlsj72E1NTfv371e7OwBUY7PZampqXnrpJbvdvnDhwgMHDqxevVrtTgERyWQyKbX14MGDancHCILBSLu5JUVot+EHQjEgjFgslv7+focj8m6nIDYVFxfLsfv+/fubmprU7g4AFZw9e7asrOy9994TQjz33HMHDhxgEwAgEEpt3bt3L7UVAGYae4oBYaSlpUUIkZuby18UiBTFxcWXLl06ePCgXOhRXFysdo8AhM6HH364Y8cOu92u0+l27ty5bNkytXsERIPi4uJTp04piyiprQDgn+bmZiGE0WjMz8+frA0zxQAAASkrK5Pj9bq6ukuXLqndHQChYLPZNm3a9OMf/9hutz/44IMfffQRiRgQRBUVFbK2vvvuu9RWAJg5hGIAgEApY/fq6mrG7kDUO3v27NNPP3306FEhRHl5+d69e9lTHwi6iooKk8k0ODhIbQWAmUMoBgAIgrKystzcXMbuQNR77733nnnmmWvXrmVnZ3/wwQfl5eVq9wiIWhUVFUpt7e3tVbs7ABCFCMWAMGI2mx9++GE2FEMk0mq127Ztk2P32tragYEBtXuEaOASrjFX8P/N1sf/+z/Xrfp2WmKimInzR+sDq2w2W1lZWU1NjRDikUceOXDgwKJFi9TuFBDN3Gvr9u3bqa2IRM6ZKeVZdySYi9MfuDeVUg4vioqKVqxYkZ2d7aUNoRgAIDjk2H3u3LmXL1+urq5m7I7AuVzC6XIF8V9Solhxv+ap7+mNdyQuujv5ucdmfasgJbiXcLpcLhGFY+njx48//vjjJ06c0Ol0VVVVO3fuZMkkEAKytqalpVFbEaGCXmS1mrhHl2uf+PP0jFkJyxanPvU9/cL5yZRyTMhgMGRkZGg0Gi9tePokACBotFrtli1bqqur5dh9586d6vansbHx448/7unpEULodDqz2VxSUqLT6SZsfPjw4dbW1vb2dvmp2Wx+9NFHs7KyQtddjON0iTFn0M629J5U032a5KQ45UhyUtzKorT770k98puBq5aRoF0p6gbSu3fv3r17txBi4cKFW7duZYIYEEoyF5O1dfv27du2bVO7R3/U2Ni4b98+IcSePXumrJh2u728vNxut5eUlLz44ovuX2pvb+/s7JSnkkpKSlauXFlUVDQT3UYoOZ1BK+UpSXFLF6YuvSfVvZSnp8UXL9Muujul5eSApX8sOFcSUVjKMZmE119/Xe0+APjayZMnb926lZmZmZhIYI1INXv27G9/+9stLS0Wi6W3t9dkMqnSjZ6enpdffvmzzz5Tbqrfvn27vb398OHDBQUF8+bN82j/2muvHTp0SMZn0pdffnn06NGioqI5c+YE3h+dTsf/1344fW3k1LURlxAB/rszM2ntSt3i3JSEhLjxV0lJilucm3KHIaG7b2T4tivwyz2yMCUzPSH0366Z0N3dXVZW9vHHHwsh1q1bt2PHjplb42+xWCwWS3p6OnPQAA9Kbe3u7laxtnqw2+01NTW3b98WQqxbt26ye06KQ4cO/du//ZsQoqCg4KGHHlKOy5Kt3JSSOjs7jx49mpycvHjx4qD3PDU1NTU1NeinxYSazjt6bWOB19b8O5PXfjc935g8YSnXa+OXFKSma+Ov9I6MjFHKI0xHR4cQYiYGGBaLJSUlZf78+V7aMEAHwkhLS4sQIjc3l23FENHy8vK2bNnyox/9qKmpSQhRUVER+j7s2rWrp6dHp9Nt2LChpKRECNHe3i4P1tTU7N69233svm/fPjkW37Bhg9lsFkK0trbu27evp6dnx44db7755pQDfcwQp0uMBbath16bsPoB7YI7k6dsWXBncsGdyf96evDE2SHHSEAXjZq7y5988smrr75qt9t1Ot3WrVtXr16tdo+A2JWXl1dZWfnGG2+oWFs9NDY22u12Hxv39PQ0NjZO9tWVK1cWFBTIEiyEkLPG2tvb9+3bV1BQwHyxiOZ0uQIs5ZmGxNXf1ubMTZqyZWFuSsGdyf96avDEuaFAriiiqJTHuObmZiGE0WjMz8+frA17igEAgm/JkiVyvN7U1LR///4QX72zs1OGXC+88IJMxIQQRUVFP/3pT3U6nd1uP3z4sNJYGaa/+OKLynB85cqVmzdvll91b4wQC2Sj/cQksfy+tA2PGnxJxBR/dl/ahkcNi3NTAtqdN/KH0jabraam5qWXXrLb7QsXLjxw4ACJGKA6k8mk1NaDBw+q2xlZPX3fZKChocFut0/YPisrq6qqSinBQoiCgoKf/OQnsjFVONI5A6iniUnikQe0f/mowZdETEpJinvkAe0P186+c25ijJdy+IhQDAAwI4qLi+XYff/+/fK2dsh0dnYKIXQ63cqVK92PZ2VlybvN169fVw62trYKIQoKCpT4TFKOyAZQhZwp5t+/zMzkrNzU+MQJFll4p9cm3L1EG8hIOtJvMJ89e7asrOy9994TQjz33HMHDhxg/jIQJpTaunfv3hDXVg+7du0SQpSWlvrSWG5fUFRUNK05X7KIu5dsRKJAQrH77tNm5KT4sSOZXpswf/msWC7l8B2hGABgphQXF69bt04IUVdXp+7Y3YP7ckiZeXnEZ5Icu3d2dvq+PATB5XIJp9PPf7ZB51hy/Plh19XhaYxrrww6fz4kfini/b6u0xnZ4+gPP/ywrKzs3LlzOp3u3XffraqqUrtHAP5EcXFxcXGxULW2NjY2tre3l5SU+BJy2e12maB5bK4/JfYuiA7OQEr5kNORGH92yNU3nW0Nrgy73hkU/+qKi9lSjmlhTzEgjJjN5r6+Pm7II5qUlZUNDAw0NTXV1dX19vY+++yzIbjoihUr9u3bZ7fbW1tb3dOunp4euaxSGcTb7XY5raygoGD8eRYsWCA/6OzsZEMTVcjlk/69Vg5oExLi7EJ0DLhyNXFpXm8FOsZcnzjEaVe8HAj7fV0hRISuueju7t6xY8fRo0eFEA8++ODOnTvZ8B4IT8oiyrq6uoGBAXn/KWTkwkm5a6fyNBsvGhsbe3p6NmzYMN0HOssCTf2NdIFsDypfF58Q95VL9NiduWnx3kv5rduuj51xV8a+niQeg6UcHoqKirRabXZ2tpc2hGIAgJnlvrnYr371q+9///smk0mr1c7cFeVIfdeuXTU1NT09Pe5759vtdrPZrIywlcdNjn8epRBCGb67P5USoRTISNrp9sKEpLgro0LcduZr45MmWk/52aDrcxHncLtUICPpyGKz2T755JOmpiYZhwkhysvLy8vLVe0UgCkotXXv3r0ffvhhCGqrYseOHXa7vaqqSqfTTRmKtba2NjY2um+i76POzk4vU7kRQQLZaN99wlZCcvyVUZFw25mvix+fjDlGXSdG4/517E9qfOyUckzGYDDo9XqNRuOlDaEYAGDGVVRUmEym2tpai8VSV1cnhMjNzQ187J6fn19WVjbhl0pKSrRa7dtvv71v3759+/Ypx5XnS0rKusjJbl9nZWV5T8Sampp+9atfTdnV5OTk+AmGcLHuySeffOKJJ7w0CGSm2AQvTI6/OCK0TpcxNU75YVwZdv3SGWd1eUZlAd1enmb7mpqaM2fO+H25QHR3d1+7dk359JFHHtm8eTMTloGIUFFRkZeX94//+I8hq61CiH379nV2dq5cudKXrKqnp+ftt98W01w4KZ+HozwDZ8Kp3O6qq6t9P7mUmJiYmMgfwuLee+8NwRr5sQBK+fjXjSXHnxly6eNETuofC/cpu/NofLxjfOMQlnJELn4XAGHEYrFYrVaHw5GSkqJ2X4AgM5lM77zzTltb24cffnj58uXLly/P6OXsdvtnn302fi8wuaByulPAvOwp1tvbe/r0ab/7GeMeeugh7w0Cmyk28fGB+LizQ665iSLJ5frYGX9lbOKd+AMbSU/vtWfOnDlx4oTflwvcwoULn3zyydWrVxOHAZFl3bp1xcXF8vZMCGqrnPaVlZX1wgsv+NJezinbsGHDlMGWEGLjxo3uRbmkpOTRRx/15YVU4TAXrJliioSEuAEhOgacuZp4+23nURF/JS5+wsIbylKOyEUoBoSRlpYWIURubi5/liAqabVaZXvgU6dOBeWEEx632+2vvfZaZ2dnVlbWhg0b5N3s9vZ2uTHwyy+//Oabb053Z5PJFBcXL1myZMpmc+bMSU5ODsoVo8mUv+tcLtfYZOHWVJyTD4VnJ8Vp4kXHSNzg5E+08vu6YvobkWzevNlms/l9uQAtW7ZMrUsDCJxWq123bt26desGBgYuXboUlBNOeLyzs1NO+9q8ebMvW+Dv2rVLzimb7sJJ6fDhw3IDhCn3FPvZz3423ZPrdDp28RdChGbjSKfT/5LqpZ5mpcb3jYorcfG3xiZtE8pSjvDU3NwshDAajfn5+ZO1IRQDAKjAlyDJb3JxR1ZW1ptvvqmMeuWT4F9++eXOzs5du3b95Cc/EZMP/T14GTpnZmZmZmZOeYZ58+alpqb61n38kWvyCV9TmvCFafEiI0GkxYlBp9DHiT9LFF1Occ4pBsc1DmAgPW2LFi0K3cUARCmtVjtztdVut09r2ldjY+Phw4d9n1MmhNizZ4/y8eHDh9vb21tbW9vb21988cWSkhIvL/TjXRsMBoPBMN1XwT/OAErqhMlUWryYlyCS4sSwU2QIsSpRXHKKc2NiZPylCbbgA/Y3AQBEFbkXiRCitLR0fJi1YcMGIUR7e7t8ppXSYLIFknIpR2i2LsZ4cvmkf/88ZoolxYl5ieKuRJH2p8slc+LFqkSxMEEk/eml/b7umIu7ywCizWuvvSbnbfky7Us+2Uan0/30pz/1b0JWSUlJVVWVLNm7du3icTcRzRlAPfVYPpkUJ+5KEnclCo9n5uTFi+8libxx2QalHL5gphgAIKrItEsIMeGtbGUVRmdnZ0FBgfLQyZ6envEDdyUpm/DZlAiBQDbadx9J35EgZidMeicwUYiF8eKuOHHaKa5/s6CS57gDgHT48GFZWxsbG+X+9+Nt3LhRCFFSUvLiiy/K59vY7XZ5cMITyttXe/bs8bKbgdlsbmxstNvtra2t/q3BRDgIZE8x5XXx35TyySQKcV+CuCtenB4Tfd+8ilIOXxCKAWHEbDb39fWxoRgQMllZWTqdzm63t7e3jw/R2tvbhRA6nc6XpSKYCYFvtK+LF5kJnreUJ6SJE8sSRF+8OD0mrAFcVwjBQ6sAICgKCgpkLUbkCnyj/VnxIjPRpzVucmOE607R4RSDlHIIUVRUpNVqs7OzvbQhFAMARBVlwpecC+bxVWVsrayIXLFihdy7ZPxdaNl4xYoVM9hdeBXIRvvpqfF3JXkulpxSRpxYlSi6nOJ8ILvz+v1KAAg/JSUlk+3q1dPTI6eDuc/5ct8dzMOuXbsOHz4sJ5T5cmll9jci15jL/w3vZ2sScpNEymSlfJKzzosX8+LFOUo5hDAYDHq9XqPReGnDnmIAgKhSUFAgs7CGhobxX5VrOnQ6nbKOUnk2pce96M7OTrm4QzaAKpxyMO3Xv9/3OM51O8amP6oddIrO83a/rzvmYs0FAEyDLM3jybWTgkIc4ZwB1NNPT966/NXtyc7spdgOOsWXv7lJKYcvCMWAMGKxWPr7+x0Oh9odASKbnPPV09Pz8ssvK1FXe3v7a6+9Ju85m81m96dSytF2TU2NTMGEEK2trTt27BBClJSUTPkweMwcl0s4XS7//t2wjfzPD6+98Yvr1wcmf1r7OCe7h//uf3e1/forv6/rZBwNANPR2tq6ceNG993K5HOiZVhmNpu97DuG8OcKoJ7esI3s+KfuusOWmw7n1FcSQggx4hInu4f/V/3ls6dvUcrhC5ZPAmGkpaVFCJGbm8u2YkAglJCrs7Pztdde8/jqhg0bPFZKvvDCC9evX5dD8F27dinHi4qKfFzfgRkSyEb70oVrQ//vP/zh4W/p16/MSPF6K9DicP7icM9XPcOBXE5iKA0A09LT07Nv377xU8bMZrN8BiUi11jApfzzC/bPL9jXmmave8DgvZR33ho99NG1QftoIJeTKOXRobm5WQhhNBrz8/Mna0MoBgCIQitXrlywYEFra6uy+EIIYTabV65cOX6jMZ1O9+abb8qHasnGBQUFjz766GRbqCBkAtlo313TF7eavrj1nx/LWpGvTRi3NcmgU/zLsb4zp28FfiHJxVgaAHy2Z8+exsbG1tZWZQcxnU4nSzZzxKJAIBvtu/vnYzdaTll/8L3Mb+ekjv9qr8P56YmblHL4gVAMABCdsrKyzGaz7w9xn1ZjhEYgG+2P9/a/XP9Al/jf/oMx15Akj4y4xO+6hw8euhqsS0isugAQI7Kysn7xi1/43v7FF1+ccAo2JTiKOZ3+b7TvwWId+f/+z9WC7NS/eWzePF2CPDjiEp+esf76U0tQLqGglMcOQjEAABCm5Eb7QWSxjf7tvj88eI/uB9/LvNA/2nCoeyAYiywAAMCEgl7Kz3UPV/7d5e8VGf7CNOdU3+3/+/F1SjkCQSgGhBGz2dzX18eGYgAguYK0fNLDb87ZfnPOFvTTKri7DACANBak5ZMeDp+8efjkzaCfVkEpjw5FRUVarTY7O9tLG0IxAAAQppwB786rigjsMgAAMyJYe4qFWAR2GRMwGAx6vV6j0XhpQygGAADClMslIvOx6JHYZwAAgs/lclHKEc4IxYAwYrFYrFarw+FISUlRuy8AoL7gbrQfMpHXYwAAZsaYK2gb7YdS5PUY/iIUA8JIS0uLECI3N5dtxQBAfL07b+SNSyOwywAAzAiWT0JFzc3NQgij0Zifnz9ZG0IxAAAQplyuID+yKjQisMsAAMwIJ6Uc4Y1QDAAAhKkI3WgfAABI6anxkVjKZ6XGq90FhAihGAAACFNPLE7f+eu+W8NOtTsyDfdnp96fzb6QAAAIIcRfPjDrF6etavdieu7PTi3KTlW7FwgRQjEgjJjN5r6+PjYUAwCpKDv1xH8tuHzzdoDn+erqpdbGvVM2e/K//izACwkhlhpTDakJgZ8HAIAo8GRh+oWqe0JTyu+4M2+luSzACwkhHsnXBn4ShIOioiKtVpudne2lDaEYAAAIX7mzk3JnJwV4kk6X5jdJU5+EQTAAAEEXslKeoUumlMOdwWDQ6/UajcZLG0IxAAAQ5eLj41NSWNIIAECk8qWUJ/lwAwzwQCgGhBGLxWK1Wh0OB3+8AUAQEYoBABDRrly5MmUpT05ODk1nEE0IxYAw0tLSIoTIzc1lWzEACCJCMQAAIlpCQsKUpfz69euh6QwiRXNzsxDCaDTm5+dP1oZQDAAARLm+vj5fQjH03TC8AAAYDUlEQVSr1arX60PQHwAAMC2JiYnc38JMIBQDAABRbnR01JeRtN1uJxQDACAM9ff3+1LKbTZbenp6CPqDqEEoBgAAotxXX33ly0i6t7eX1esAAIQhm83mSynv6ekhFMO0EIoBYcRsNvf19fEnGQAE0cDAwM2bN30ZSV+7dm3p0qUh6BIAAPDdzZs3R0ZGfCzlCxYsCEGXEBGKioq0Wm12draXNoRiAAAgmnV2dvq4C8nQ0FB3dzd3JgAACCtnzpzxsZRbLJZbt27NmjVrpruEiGAwGPR6vUaj8dKGUAwAAEStrq4uXx7irvjd736n0+nYWQwAgDBx7ty5Gzdu+F7Kv/jii+XLlyclJc1orxA1CMWAMGKxWKxWq8Ph4NEqABCgoaGhixcvXrt2bbq/UT///PP58+fPnz8/MZFhEgAAqrHZbBcvXrRYLNMq5Q6Ho7W1deHChZmZmZRyTIn/RIAw0tLSIoTIzc1l8Q4A+Kenp6evr89utzscDiGEf/cYrl69evXqVa1Wq9PpsrKyWIUBAEDIBKWUd3Z2dnZ2zpo1KzU1df78+ampqcHuJiJAc3OzEMJoNObn50/WhlAMAABEiYsXL3711Vfy48Cn3I6Ojvb39/f39+fn599xxx0B9w4AAEzh/PnzN2/elB8HXsqHh4eHh4dtNtvixYvT0tIC7h2iEKEYAACIBoODgzdv3kxISAj6mbu6ugjFAACYaf39/VardSZK+eXLlwsLC4N+WkSBeLU7AAAAEAR2u32Gzjw2NjY4ODhDJwcAANLMVduhoaEZOjMiHTPFgDBiNpv7+vrYUAwA/JCZmZmZmal2LwAAgJ+MRiN/CiGIioqKtFptdna2lzaEYgAAAAAAAIgqBoNBr9drNBovbVg+CQAAAAAAgJhDKAaEEYvF0t/fL589DAAAAAAAZg7LJ4Ew0tLSIoTIzc1lLT0AAAAAAH5rbm4WQhiNxvz8/MnaMFMMAAAAAAAAMYdQDAAAAAAAADGHUAwAAAAAAAAxhz3FgDBiNpv7+vrYUAwAAAAAgEAUFRVptdrs7GwvbQjFAAAAAAAAEFUMBoNer9doNF7asHwSAAAAAAAAMYdQDAgjFoulv7/f4XCo3REAAAAAAKIcyyeBMNLS0iKEyM3NZVsxAAAAAAD81tzcLIQwGo35+fmTtWGmGAAAAAAAAGIOoRgAAAAAAABiDqEYAAAAAAAAYg57igFhxGw29/X1saEYAAAAAACBKCoq0mq12dnZXtoQigEAAAAAACCqGAwGvV6v0Wi8tGH5JAAAAAAAAGIOM8WAMGKxWKxWq8PhSElJUbsvAILJbrcPDw/39fU5HA61+wKEKYvFonYXAMSE4eHh/v5+m81ms9nU7gsAlRGKAWGkpaVFCJGbm8u2YkCUsdvtQojOzk6r1ap2XwAAiGnDw8PDw8Pd3d3d3d1q9wXADGpubhZCGI3G/Pz8ydoQigEAECIZGRk6nU7tXgBhLT09Xe0uAIgJ6enp3IcGQCgGAECIZGRkqN0FAAAghBDp6emk8ADYaB8AAAAAAAAxh5liQBgxm819fX1yIvetkXjrSILaPQrUXWkjancBAAAAABBzioqKtFptdna2lzaEYkDYuTycdmk4LXd2ck5GZIdiQ6Ou4zdGbw3e/s4sa3rCqNrdAQAAAADECoPBoNfrNRqNlzaEYkB4uZD+wLc0hufvTVa7I8Fxf2bi0GjK/72QrBu23asdULs7AAAAAAB8jT3FgDDSMTz7OwV3rL47ShIxSZMY99S9qbZ4nW2MFB4AAAAAEC4IxYAw4kyft9yYpHYvZsTae1K/GNCr3QsAAAAAQExobm4+ePDgxYsXvbQhFAPCxfkbYw/lpKndi5miSYwbi2OmGAAAAAAgXBCKAeHi/M3Re+ZE9s763i3MSLo1wu8cAAAAAEBY4A9UIIxoEuPU7sIMykiNt45Ec+oHAAAAAIggrGYCAAAAAABAVCkqKtJqtdnZ2V7aEIoBAAAAAAAgqhgMBr1er9FovLRh+SQAAAAAAABiDqEYEG3OWgbLDpyrOXolWKfa9M+dNsdY4GcDAAAAACB8sHwSiCoyxrI7xk502azDY1sfyw38VEKIsgNn9z69KD2FbfIBAAAAABGgublZCGE0GvPz8ydrw0wxIHq4x1hCiIMdfX7PF+u23nY/1TnLUNmBs8wXAwAAAABEDUIxIEp4JGLSmd4h/87WfcvhcSpyMQAAAABAROjq6pIfeH/6JKEYEA0mTMSEEPdmenvQhheLMtMWzvV8LbkYAAAAACD83bhxQwiRlJTE0yeBKDdZIrauMKPqkbv8O2d6SsLepxeRiwEAAAAAIs7s2bOLiopWrlzpvRmhGBDZvCRigeyyL8jFAAAAAACRaXh4OCcnZ/ny5d6bEYoBEWzmEjGJXAwAAAAAEFn6+/tHR0c1Gs3s2bO9tyQUAyLVTCdiErkYAAAAACBSOByOo0ePCiGMRuOUjQnFgIgUmkRMIhcDAAAAAESElpaWa9euHT161GAwTNmYUAyIPKFMxCRyMQAAAABAmPvd7353/vx5IcQDDzyg1WqnbE8oBkSY0CdiErkYAAAAACBsDQ8PHz9+XAgxZ86cJ5980peXEIoBkUStREwiFwMAAAAAhKHh4eHLly/LCWJlZWUajeffrROKc7lcM90zAL74l07HvytI8dJA3URMYXOMlR04e84y5HF84VzN3qcXpackTPbC8zfGrl+/flfayAx3EAAAAAAQKxwOR09Pz+DgYFJSUmZmZmFhYULCpH+WeiAUA8KF91Ds11ds/+0XF4ZHnB7HPRIxx6i96fL/umL97S1Hz4LZ330w+6n5s5aOP9tnV/7+/M2W3oHOuWkL7st87KHsp8a3uXDj161d9b0DncnxugUZ3/1e7n9JTdTJL02Wi82dlfL+9++dm5Y44VsgFAMAAAAABNEXX3zx+eefJyQkPPzww3Pnzl24cKHviZggFAPCh5dQ7NdXbC/9nwsjo1MnYvs7Ki0DnS4hXK64MZcYdcX9x8Vb781Y6f6qjy7899OWX8o2TiFGXXHLsksfy/8b9zanLL/85YX/Ltu4hBh1xWWkFfynb701ZS42R5/8wfrFE+ZihGIAAAAAgMANDw9fvXq1qalpdHRUHnniiSdWrlzp/VXjTTyhA0BY8SURE0KcuPZPHonYqCvuw7O77l3xx18NvQMXPBKxUVdcyx8a75/7mDG9QGn2yaX/6Z6IjbrEVdvF490ff3d+qWwg9xcbn4vdsN4u/+cLDd+/d8I3cvzE8bG7ZsmP29rabty4IT9esGDBPffcw3GOR8dxk8k0Z84c+fFHH30kvsFxjkfT8ccff1x+cOPGjba2No5zPPqOz5kzx2QyyY/Pnz9/4cIFjnM8+o6H2yCK4xz35fhDDz2UlpYmhEhM/DrRys7Ofuyxx+69d+I/Qr0jFAMigC+JmBDiivW3HonYyEhcr73n6q3OO2d9HXhduPFrj0RsZFSMOOK+6G41Lir45jwnh8cG3BOxUWfcbUfcyaufKaGY+CYX+8H+sxf7/iQXG7zt2VtFfFy88psrLi7uj8fjOc7x6DmekJCgHHfHcY5H03HloMcKBY5zPGqOx8XFKcfj4+M5zvGoPB5ugyiOc9yX47du3Zo3b15qaqper09OTl6yZMkdd9wh/MXySSBceFk+ufR/nHD/1Jit+8FK4zPz0z2a7T9d+ftbXzjdErHbDnH7dtzmVbtzZn8deLVe+fvWK//gkYjddsStKfjLf3/fBtnmivXkP556ySMRu+2Iy02/v/LhN92v2D00WnfmZuu/XbfZbysHszM0H/2gcPy7OH9jrNfS+61srfy0p6dneHhYfmwwGGbNmsVxjkfH8aysrNTUVPnx73//e/ENjnM8mo7ffffd8oPh4eGenh6Oczz6jqempmZlZcmPb9261d/fz3GOR9/xcBtEcZzjPh43Go3T2jjMC0IxIFx4CcUeqvutMlnMmK27b3GGEGLZnBSPXOzXV/6+5Q//4JGIJY6k/Y+n/llp0ztw4e/af+iRiN0edr3yF7vvmrNAabazbe3A6KB7IjYyLP6f+8r/YvEfZ4p1D42+feHW8JhrdNR5/PMeJRf7s4Wz316bP/5dnL8xJoS4Z05wfnkBAAAAABCI+KmbAFDbW/9hQVJivHBLxIQQx284PviDzb3ZsuyntMnz3BOxkUFXadGL7m0ytQsK5z7mkYgtM65xT8SEEMV5/8UjEctMzVtR8KjSQEnEhBCJifHLvp2VrksWQnzrbv2EiRgAAAAAAGEl4fXXX1e7DwCEEOL8zbF75kywb4sQYv6slEKj7ox9ZNGiOe7Hu4fGbt4eWzLr6/llifHJRVmP3Rq++fu+ztuOuKyU/Ge/vek7+as9zrYo47tjTvGHvs7BoVFdfObDeeZnv/M3Hm2ytAuytAu6b125aetPdGqLsh7+z3/+alqy7pvr/jERk+Lj4+ZlaXO0Se8+USAmcWPIJYTI0JDFAwAAAADUx/JJIFx4WT4pjY+ipPHrKGeU391g+SQAAAAAIHwwZQOIGEZN4gsLZqUmxHkcH7+OcuaESTAHAAAAAECACMWASKJuLkYiBgAAAACIGoRiQIRRKxcjEQMAAAAARBNCMSDyhD4XIxEDAAAAAEQZQjEgIoUyFyMRAwAAAABEH0IxIFKFJhcjEQMAAAAARCVCMSCCzXQuRiIGAAAAAIhWhGJAZJu5XIxEDAAAAAAQxQjFgIg3E7kYiRgAAAAAILoRigHRQOZiRk2ix/HjNxw3b4/5ccJTt26TiAEAAAAAohihGBAljJrE8nG52PjpY76fzeNIBCViHR0dq1atWrt2bVdXl9p98aatrW3p0qVLly5VuyORgW8XAAAAgOAiFAOihyYhzj0XS02Ie2HBrNnJCX6casms5Gfm65RPQ5+IWa1WmYDU19dP2XLVqlXuLdva2qxWa1dXV1tb28z3FAAAAAAQkQjFgKgic7H7ZiXn65ImXFDpu2VzUp+Zr8vXJf35XE3o54jp9fo1a9YIIY4cOeK95ZEjR6xWqxCitLRUHjGZTHq9Picnx2QyzXQ/AQAAAAARyv8/mAGEJ01C3H/K0wflVMvmpC6bkxqUU/lh+fLlR44c6ejo6OjoKCwsnKzZsWPHxDdBmDxSWFj46aefTvdybW1tx44d6+jo2LNnj999jlCx/N4BAAAAxCxmigEIU2vWrJE5l5dVkFarVU4lKykpCfByHR0dUy7VjFax/N4BAAAAxCxCMQBhSq/Xy/WPXlZQNjQ0CLe1lgAAAAAA+IhQDED4kvO/5ArKCRvItZPKnDIAAAAAAHxEKAYgRPqGnZqkuGm9xPsKSuX5ksuXL3c/3tbWJp9cOeGRjo6OjRs3yk+7urqEEGvXrl26dGltba17y6VLlyoX9fjU3datW5cuXbp161aP4w0NDfJL0tq1awNcnyj7LE9y5MgR5S2sWrXKy5kbGhrWr1+vdKO2tla+ZYWX9648AHT8TL0jR47IL8lHHLiTTwL1+F4dOXLE/bshrzg+6PT+Y5pMfX29jw8qBQAAAAB3hGJAuMhJT/iid1TtXsygLqszJ33av3PkMyXlMkkPMqyZ1trJjo6O8vJyL5uUBcXGjRu3bt3q3ueurq7a2tqNGzcGfvL6+vqqqirlLVit1tra2qqqKo9mVqtVdsM9e6qvr1+7dq2Pb1/5xo5Pr+QEPTEurOzo6LBarcq6V6UbVVVVHj/B+vr69evXTxZj+f5jqq+vl4leZWXl888/78v7AgAAAACJUAwIF/fMSTh3Y0ztXsyUoVHX0KjLjxfKWWBdXV3joxkZisnUzEe1tbWLFy8+dOjQyZMnT548mZOTI4SQn1ZWVgohTCbTyW8oyc50Xb16NScnp7KyUjmVzGva2tomTPd8d+zYsdra2ueff16e9tChQ8q2ax7zuZRQSenG+++/LxtXVVUpM7y8v3f50M/x4ZRyLY8fimzp/n1TuvH8889/+umn8uR79uyRbWprayf8hkz4YxqvoaGBRAwAAACA3wjFgHChSYxLSxLROlnsn844Vt+d7McLTSaTzEQ8Qh9lo7FpbbF/9erVPXv2TBayBMuaNWsOHTrkHtNUVlbKGEiZY+Wftra2yspKmWEJIXJycpS3c/jwYaVZQ0OD/Oa8//77SjcKCwtlY6vV6mM2p8wUcw+/5HQw+aXxyySF25NAlW7s2bOnsrJS2ffNZDK552Ljr+vLj6mtrU2uWiURAwAAAOAfQjEgjPy7gpRzN8aiLxf7+anhe+Yk+LF2UpJzwTxCMRnHFBYWytlMPgpNeqKEVu7klLfxm3BNS2Fh4fi3IPOpq1evKkdk5lVaWjr+mzPhN3MyOTk54yeLKclXYWFhR0eHsuGX1WqVEZgyU0zpxoRz7l599VX5qvGdmfLHJHccEyRiAAAAAAKQqHYHAPyJp+5NOdY9IlOkjNSIj63P3xztG3KtvjvZ70RMfBOyyG31PQKXaU0TE3+6sm+mtbW1yZCoq6srwFWTign7L2dUKXGbEk55PH/AvbH3revdrVmzxmOmWFtbm9xuTB4/cuSIsjhU9lDOCPPeDfFN4uYeq3l/mwq545gQorS0lEQMAAAAgN8IxYCws9yYtNyY1GVzDo34swlXWDEZkzI0gUZ7cjpYR0fHsWPHZFyiJCnTDcVmeuGkJB89ORNnVlYgeqFkTON331f4PmFNfsOVmWIyCJPfdjmJTMnLPCIwpRuLFy+e7OTp6eliooTO+49p8+bNVqu1tLRUzjUDAAAAAP8QigFhKpCpVdFHzktqaGiQKxPlgjtlu7GwUltbKx+qWFhYqIRHJpNJeU5iZCksLNTr9XLaV2FhoUzH5K5hclKYkpeN32V/htx5551dXV1HjhyZcH0oAAAAAPiIUAxABFizZk1tba3VapUrKOVqRGVDdxV5TLmyWq0yEVNxrytlNtn7778flMyotLS0vr7+yJEjhYWF8kEBMvnS6/Umk+nIkSMdHR05OTkyNVOuqHTjyy+/nCy7tNlsYvrT9/bs2bN+/Xq5iPL9998Pw2AUAAAAQERgKgqACJCTk6M8vbGtrc1qtcptrUJzdZnvuO+rpfB4/OKXX34pP5D72bub8OUzIScnR3ZY6UyAlL32ZSi5Zs0aJfBSviRjSvdpYjk5OTKumuyBm11dXR4b8/tu9+7dhYWFVqu1vLzc9/3RAAAAAMAdoRiAyCDnhTU0NMiQxT2aCSI5d8nDZOFOfX39ZJtzeRyXG9IHqY9Tk5Gcl+5NaML3Lr5ZJimXr4pvgjBJ5pJyspgYt6e+7EZDQ4NHdCjJxaTKAy6nRa/X79ixIycnp6uri1wMAAAAgH8IxQBEBpm/WK1WGc1M9kxDv8nkS4l+3Mlwp62traqqSomZamtra2trPdbuKZvKb968WZkaVl9fX15eHspVfqWlpXq9vqura/369XI5p6K+vn7jxo0e7b28d/HNMknxzVZu7pPgZKTV1dX15ZdfKs3cuyHPvHHjRrn6VR5va2vbuHGjPNuOHTv8e485OTm7d++Wb5NcDAAAAIAfCMUARAZlveQMrZ1Utu3funXr0qVLly5dqsxvUjZ0P3LkyKpVq+RX6+vrKysrPWIgvV4vHwXQ0dGxfv162bK2ttZkMo1fUDlz3AOj2trapW5qa2vHz9vy8t4l5UGTct99j9dardaurq7xqyD1er1c5yiEqK+vV751GzdubGtr0+v1e/bsCWTXM49cbFrT4gAAAACAUAxAxFB21p+JgEmuyHNPdu68807l4/fff7+ystJ9L62ampoJt9J//vnna2pqlKwnJyensrKypqYm6B32rrCw8NChQ+59Vjpz6NAhj8be37tw+4aPzyKVdzrhcw9ycnLkt85juzHZjcAfVSl/EEII5osBAAAAmK44l8uldh8AAAAAAACAkGKmGAAAAAAAAGIOoRgAAAAAAABiDqEYAAAAAAAAYg6hGAAAAAAAAGIOoRgAAAAAAABiDqEYAAAAAAAAYg6hGAAAAAAAAGIOoRgAAAAAAABiDqEYAAAAAAAAYg6hGAAAAAAAAGIOoRgAAAAAAABiDqEYAAAAAAAAYg6hGAAAAAAAAGIOoRgAAAAAAABiDqEYAAAAAAAAYg6hGAAAAAAAAGIOoRgAAAAAAABiDqEYAAAAAAAAYg6hGAAAAAAAAGIOoRgAAAAAAABiDqEYAAAAAAAAYg6hGAAAAAAAAGLO/w/7UhEy5hV6eAAAAABJRU5ErkJggg==" + BlankLine + } Catch { + Write-PScriboMessage -IsWarning "Unable to display Load Balancer image." } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzLoadBalancerInfo = @() + foreach ($AzLoadBalancer in $AzLoadBalancers) { + $InObj = [Ordered]@{ + 'Name' = $AzLoadBalancer.Name + 'Resource Group' = $AzLoadBalancer.ResourceGroupName + 'Location' = $AzLocationLookup."$($AzLoadBalancer.Location)" + 'Subscription' = "$($AzSubscriptionLookup.(($AzLoadBalancer.Id).split('/')[2]))" + 'Provisioning State' = $AzLoadBalancer.ProvisioningState + 'SKU' = $AzLoadBalancer.Sku.Name + 'Tier' = $AzLoadBalancer.Sku.Tier + ##ToDo: NAT Rules + } + + if ($Options.ShowTags) { + $InObj['Tags'] = if ([string]::IsNullOrEmpty($AzLoadBalancer.Tag)) { + 'None' + } else { + ($AzLoadBalancer.Tag.GetEnumerator() | ForEach-Object { "$($_.Name):`t$($_.Value)" }) -join [Environment]::NewLine + } } - $AzLoadBalancer | Table @TableParams - # Get Frontend IP Configuration - Get-AbrAzLbFrontendIpConfig -Name $($AzLoadBalancer.Name) + $AzLoadBalancerInfo += [PSCustomObject]$InObj + } + + if ($InfoLevel.LoadBalancer -ge 2) { + Paragraph "The following sections detail the configuration of the load balancers within the $($AzSubscription.Name) subscription." + foreach ($AzLoadBalancer in $AzLoadBalancerInfo) { + Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzLoadBalancer.Name)" { + $TableParams = @{ + Name = "Load Balancer - $($AzLoadBalancer.Name)" + List = $true + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzLoadBalancer | Table @TableParams + + # Get Frontend IP Configuration + Get-AbrAzLbFrontendIpConfig -Name $($AzLoadBalancer.Name) - # Get Backend Pool Configuration - Get-AbrAzLbBackendPool -Name $($AzLoadBalancer.Name) + # Get Backend Pool Configuration + Get-AbrAzLbBackendPool -Name $($AzLoadBalancer.Name) - # Get Health Probe Configuration - Get-AbrAzLbHealthProbe -Name $($AzLoadBalancer.Name) + # Get Health Probe Configuration + Get-AbrAzLbHealthProbe -Name $($AzLoadBalancer.Name) - # Get Load Balancing Rules - Get-AbrAzLbLoadBalancingRule -Name $($AzLoadBalancer.Name) + # Get Load Balancing Rules + Get-AbrAzLbLoadBalancingRule -Name $($AzLoadBalancer.Name) + } + } + } else { + Paragraph "The following table summarises the configuration of the load balancers within the $($AzSubscription.Name) subscription." + BlankLine + $TableParams = @{ + Name = "Load Balancers - $($AzSubscription.Name)" + List = $false + Columns = 'Name', 'Resource Group', 'Location', 'SKU', 'Tier' + ColumnWidths = 20, 20, 20, 20, 20 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzLoadBalancerInfo | Table @TableParams } } - } else { - Paragraph "The following table summarises the configuration of the load balancers within the $($AzSubscription.Name) subscription." - BlankLine - $TableParams = @{ - Name = "Load Balancers - $($AzSubscription.Name)" - List = $false - Columns = 'Name', 'Resource Group', 'Location', 'SKU', 'Tier' - ColumnWidths = 20, 20, 20, 20, 20 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" - } - $AzLoadBalancerInfo | Table @TableParams } } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzNetworkSecurityGroup.ps1 b/Src/Private/Get-AbrAzNetworkSecurityGroup.ps1 index 988f3c0..dfa8827 100644 --- a/Src/Private/Get-AbrAzNetworkSecurityGroup.ps1 +++ b/Src/Private/Get-AbrAzNetworkSecurityGroup.ps1 @@ -1,11 +1,11 @@ function Get-AbrAzNetworkSecurityGroup { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Availability Set information + Used by As Built Report to retrieve Azure Network Security Group information .DESCRIPTION .NOTES - Version: 0.1.1 + Version: 0.1.2 Author: Tim Carman Twitter: @tpcarman Github: tpcarman @@ -23,76 +23,93 @@ function Get-AbrAzNetworkSecurityGroup { } process { - $AzNetworkSecurityGroups = Get-AzNetworkSecurityGroup | Sort-Object Name - if (($InfoLevel.NetworkSecurityGroup -gt 0) -and ($AzNetworkSecurityGroups)) { - Write-PscriboMessage "Collecting Azure Network Security Group information." - Section -Style Heading4 'Network Security Groups' { - if ($Options.ShowSectionInfo) { - Paragraph "An Azure Network Security Group (NSG) is used to filter network traffic to and from Azure resources in an Azure virtual network. A network security group contains security rules that allow or deny inbound network traffic to, or outbound network traffic from, several types of Azure resources. For each rule, you can specify source and destination, port, and protocol." - BlankLine - Try { - Image -Text 'Network Security Group' -Align 'Center' -Percent 100 -Base64 "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" - BlankLine - } Catch { - Write-PScriboMessage -IsWarning "Unable to display Network Security Group image." - } - } - $AzNsgInfo = @() - foreach ($AzNetworkSecurityGroup in $AzNetworkSecurityGroups) { - $InObj = [Ordered]@{ - 'Name' = $AzNetworkSecurityGroup.Name - 'Resource Group' = $AzNetworkSecurityGroup.ResourceGroupName - 'Location' = $AzLocationLookup."$($AzNetworkSecurityGroup.Location)" - 'Subscription' = "$($AzSubscriptionLookup.(($AzNetworkSecurityGroup.Id).split('/')[2]))" - 'Associated With' = "$(($AzNetworkSecurityGroup.Subnets.Id).Count) subnets, $(($AzNetworkSecurityGroup.NetworkInterfaces.Id).Count) NICs" - 'Network Interfaces' = & { - if ($AzNetworkSecurityGroup.NetworkInterfaces.Id) { - ($AzNetworkSecurityGroup.NetworkInterfaces.Id | ForEach-Object {$_.split('/')[-1]}) -join ', ' - } else { - 'None' + Try { + if ($InfoLevel.NetworkSecurityGroup -gt 0) { + $AzNetworkSecurityGroups = Get-AzNetworkSecurityGroup | Sort-Object Name + if ($AzNetworkSecurityGroups) { + Write-PscriboMessage "Collecting Azure Network Security Group information." + Section -Style Heading4 'Network Security Groups' { + if ($Options.ShowSectionInfo) { + Paragraph "An Azure Network Security Group (NSG) is used to filter network traffic to and from Azure resources in an Azure virtual network. A network security group contains security rules that allow or deny inbound network traffic to, or outbound network traffic from, several types of Azure resources. For each rule, you can specify source and destination, port, and protocol." + BlankLine + Try { + Image -Text 'Network Security Group' -Align 'Center' -Percent 100 -Base64 "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" + BlankLine + } Catch { + Write-PScriboMessage -IsWarning "Unable to display Network Security Group image." } } - 'Subnets' = & { - if ($AzNetworkSecurityGroup.Subnets.Id) { - ($AzNetworkSecurityGroup.Subnets.Id | ForEach-Object {$_.split('/')[-1]}) -join ', ' - } else { - 'None' + $AzNsgInfo = @() + foreach ($AzNetworkSecurityGroup in $AzNetworkSecurityGroups) { + $NsgSecurityRules = @() + $NsgSecurityRules += $AzNetworkSecurityGroup.SecurityRules + $NsgSecurityRules += $AzNetworkSecurityGroup.DefaultSecurityRules + + $InObj = [Ordered]@{ + 'Name' = $AzNetworkSecurityGroup.Name + 'Resource Group' = $AzNetworkSecurityGroup.ResourceGroupName + 'Location' = $AzLocationLookup."$($AzNetworkSecurityGroup.Location)" + 'Subscription' = "$($AzSubscriptionLookup.(($AzNetworkSecurityGroup.Id).split('/')[2]))" + 'Associated With' = "$(($AzNetworkSecurityGroup.Subnets.Id).Count) subnets, $(($AzNetworkSecurityGroup.NetworkInterfaces.Id).Count) NICs" + 'Network Interfaces' = if ($AzNetworkSecurityGroup.NetworkInterfaces.Id) { + ($AzNetworkSecurityGroup.NetworkInterfaces.Id | ForEach-Object {$_.split('/')[-1]}) -join ', ' + } else { + 'None' + } + 'Subnets' = if ($AzNetworkSecurityGroup.Subnets.Id) { + ($AzNetworkSecurityGroup.Subnets.Id | ForEach-Object {$_.split('/')[-1]}) -join ', ' + } else { + 'None' + } } + + if ($Options.ShowTags) { + $InObj['Tags'] = if ([string]::IsNullOrEmpty($AzNetworkSecurityGroup.Tag)) { + 'None' + } else { + ($AzNetworkSecurityGroup.Tag.GetEnumerator() | ForEach-Object { "$($_.Name):`t$($_.Value)" }) -join [Environment]::NewLine + } + } + + $AzNsgInfo += [PSCustomObject]$InObj } - } - $AzNsgInfo += [PSCustomObject]$InObj - } - if ($InfoLevel.NetworkSecurityGroup -ge 2) { - Paragraph "The following sections detail the configuration of the network security groups within the $($AzSubscription.Name) subscription." - foreach ($AzNetworkSecurityGroup in $AzNsgInfo) { - Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzNetworkSecurityGroup.Name)" { + if ($InfoLevel.NetworkSecurityGroup -ge 2) { + Paragraph "The following sections detail the configuration of the network security groups within the $($AzSubscription.Name) subscription." + foreach ($AzNetworkSecurityGroup in $AzNsgInfo) { + Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzNetworkSecurityGroup.Name)" { + $TableParams = @{ + Name = "Network Security Group - $($AzNetworkSecurityGroup.Name)" + List = $true + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzNetworkSecurityGroup | Table @TableParams + + Get-AbrAzNetworkSecurityGroupRule -Name $($AzNetworkSecurityGroup.Name) + } + } + } else { + Paragraph "The following table summarises the configuration of the network security groups within the $($AzSubscription.Name) subscription." + BlankLine $TableParams = @{ - Name = "Network Security Group - $($AzNetworkSecurityGroup.Name)" - List = $true - ColumnWidths = 50, 50 + Name = "Network Security Groups - $($AzSubscription.Name)" + List = $false + Columns = 'Name', 'Resource Group', 'Location', 'Associated With' + ColumnWidths = 25, 25, 25, 25 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } - $AzNetworkSecurityGroup | Table @TableParams + $AzNsgInfo | Table @TableParams } } - } else { - Paragraph "The following table summarises the configuration of the network security groups within the $($AzSubscription.Name) subscription." - BlankLine - $TableParams = @{ - Name = "Network Security Groups - $($AzSubscription.Name)" - List = $false - Columns = 'Name', 'Resource Group', 'Location', 'Associated With' - ColumnWidths = 25, 25, 25, 25 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" - } - $AzNsgInfo | Table @TableParams } } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzNetworkSecurityGroupRule.ps1 b/Src/Private/Get-AbrAzNetworkSecurityGroupRule.ps1 new file mode 100644 index 0000000..b35fe46 --- /dev/null +++ b/Src/Private/Get-AbrAzNetworkSecurityGroupRule.ps1 @@ -0,0 +1,185 @@ +function Get-AbrAzNetworkSecurityGroupRule { + <# + .SYNOPSIS + Used by As Built Report to retrieve Azure Network Security Group Security Rules information + .DESCRIPTION + + .NOTES + Version: 0.1.0 + Author: Tim Carman + Twitter: @tpcarman + Github: tpcarman + .EXAMPLE + + .LINK + + #> + [CmdletBinding()] + param ( + [Parameter( + Position = 0, + Mandatory = $true + )] + [ValidateNotNullOrEmpty()] + [String] $Name + ) + + begin {} + + process { + Try { + $AzNetworkSecurityGroup = Get-AzNetworkSecurityGroup -Name $Name + $AzNetworkSecurityGroupRules = @() + $AzNetworkSecurityGroupRules += $AzNetworkSecurityGroup.SecurityRules + $AzNetworkSecurityGroupRules += $AzNetworkSecurityGroup.DefaultSecurityRules + + if ($AzNetworkSecurityGroupRules) { + Write-PscriboMessage "Collecting Azure NSG Security Rules information." + $InboundNsgSecurityRules = $AzNetworkSecurityGroupRules | Where-Object {$_.Direction -eq 'Inbound'} | Sort-Object Priority + + if ($InboundNsgSecurityRules) { + Section -Style NOTOCHeading6 -ExcludeFromTOC "Inbound Security Rules" { + $InboundRuleInfo = @() + foreach ($InboundNsgSecurityRule in $InboundNsgSecurityRules) { + Try { + $SourceApplicationSecurityGroups = @() + $jsonstring = $InboundNsgSecurityRule.SourceApplicationSecurityGroupsText -join "`n" + $SourceApplicationSecurityGroups = (($jsonstring | ConvertFrom-Json).id).Split('/')[-1] + } Catch { + + } + Try { + $DestinationApplicationSecurityGroups = @() + $jsonstring = $InboundNsgSecurityRule.DestinationApplicationSecurityGroupsText -join "`n" + $DestinationApplicationSecurityGroups = (($jsonstring | ConvertFrom-Json).id).Split('/')[-1] + } Catch { + + } + $InObj = [Ordered] @{ + 'Priority' = $InboundNsgSecurityRule.Priority + 'Name' = $InboundNsgSecurityRule.Name + 'Port' = if ($InboundNsgSecurityRule.DestinationPortRange -eq '*') { + 'Any' + } else { + $InboundNsgSecurityRule.DestinationPortRange -join ',' + } + 'Protocol' = if ($InboundNsgSecurityRule.Protocol -eq '*') { + 'Any' + } else { + $InboundNsgSecurityRule.Protocol + } + 'Source' = & { + if ($SourceApplicationSecurityGroups) { + $SourceApplicationSecurityGroups + } else { + if ($InboundNsgSecurityRule.SourceAddressPrefix -eq '*') { + 'Any' + } else { + $InboundNsgSecurityRule.SourceAddressPrefix + } + } + } + 'Destination' = & { + if ($DestinationApplicationSecurityGroups) { + $DestinationApplicationSecurityGroups + } else { + if ($InboundNsgSecurityRule.DestinationAddressPrefix -eq '*') { + 'Any' + } else { + $InboundNsgSecurityRule.DestinationAddressPrefix + } + } + } + 'Action' = $InboundNsgSecurityRule.Access + } + $InboundRuleInfo += [PSCustomObject]$InObj + } + $TableParams = @{ + Name = "Inbound Security Rules - $($AzNetworkSecurityGroup.Name)" + List = $false + ColumnWidths = 10, 20, 10, 10, 20, 20, 10 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $InboundRuleInfo | Table @TableParams + } + } + + $OutboundNsgSecurityRules = $AzNetworkSecurityGroupRules | Where-Object {$_.Direction -eq 'Outbound'} | Sort-Object Priority + if ($OutboundNsgSecurityRules) { + Section -Style NOTOCHeading6 -ExcludeFromTOC "Outbound Security Rules" { + $OutboundRuleInfo = @() + foreach ($OutboundNsgSecurityRule in $OutboundNsgSecurityRules) { + Try { + $SourceApplicationSecurityGroups = @() + $jsonstring = $OutboundNsgSecurityRule.SourceApplicationSecurityGroupsText -join "`n" + $SourceApplicationSecurityGroups = (($jsonstring | ConvertFrom-Json).id).Split('/')[-1] + } Catch { + + } + Try { + $DestinationApplicationSecurityGroups = @() + $jsonstring = $OutboundNsgSecurityRule.DestinationApplicationSecurityGroupsText -join "`n" + $DestinationApplicationSecurityGroups = (($jsonstring | ConvertFrom-Json).id).Split('/')[-1] + } Catch { + + } + $InObj = [Ordered] @{ + 'Priority' = $OutboundNsgSecurityRule.Priority + 'Name' = $OutboundNsgSecurityRule.Name + 'Port' = if ($OutboundNsgSecurityRule.DestinationPortRange -eq '*') { + 'Any' + } else { + $OutboundNsgSecurityRule.DestinationPortRange -join ',' + } + 'Protocol' = if ($OutboundNsgSecurityRule.Protocol -eq '*') { + 'Any' + } else { + $OutboundNsgSecurityRule.Protocol + } + 'Source' = & { + if ($SourceApplicationSecurityGroups) { + $SourceApplicationSecurityGroups + } else { + if ($OutboundNsgSecurityRule.SourceAddressPrefix -eq '*') { + 'Any' + } else { + $OutboundNsgSecurityRule.SourceAddressPrefix + } + } + } + 'Destination' = & { + if ($DestinationApplicationSecurityGroups) { + $DestinationApplicationSecurityGroups + } else { + if ($OutboundNsgSecurityRule.DestinationAddressPrefix -eq '*') { + 'Any' + } else { + $OutboundNsgSecurityRule.DestinationAddressPrefix + } + } + } + 'Action' = $OutboundNsgSecurityRule.Access + } + $OutboundRuleInfo += [PSCustomObject]$InObj + } + $TableParams = @{ + Name = "Outbound Security Rules - $($AzNetworkSecurityGroup.Name)" + List = $false + ColumnWidths = 10, 20, 10, 10, 20, 20, 10 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $OutboundRuleInfo | Table @TableParams + } + } + } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) + } + } + + end {} +} \ No newline at end of file diff --git a/Src/Private/Get-AbrAzPolicy.ps1 b/Src/Private/Get-AbrAzPolicy.ps1 new file mode 100644 index 0000000..1b39198 --- /dev/null +++ b/Src/Private/Get-AbrAzPolicy.ps1 @@ -0,0 +1,43 @@ +function Get-AbrAzPolicy { + <# + .SYNOPSIS + Used by As Built Report to retrieve Azure Policy information + .DESCRIPTION + + .NOTES + Version: 0.1.0 + Author: Tim Carman + Twitter: @tpcarman + Github: tpcarman + .EXAMPLE + + .LINK + + #> + [CmdletBinding()] + param ( + ) + + begin {} + + process { + Try { + if ($InfoLevel.Policy.PSObject.Properties.Value -ne 0) { + Write-PscriboMessage "Collecting Azure Policy information." + Section -Style Heading4 'Policy' { + if ($Options.ShowSectionInfo) { + Paragraph "Azure Policy helps to enforce organisational standards and to assess compliance at-scale. Through its compliance dashboard, it provides an aggregated view to evaluate the overall state of the environment, with the ability to drill down to the per-resource, per-policy granularity. It also helps to bring your resources to compliance through bulk remediation for existing resources and automatic remediation for new resources." + } + Get-AbrAzPolicyAssignment + Get-AbrAzPolicyDefinition + } + } else { + Write-PScriboMessage "Policy InfoLevel set at 0." + } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) + } + } + + end {} +} \ No newline at end of file diff --git a/Src/Private/Get-AbrAzPolicyAssignment.ps1 b/Src/Private/Get-AbrAzPolicyAssignment.ps1 index 8c83a88..db12298 100644 --- a/Src/Private/Get-AbrAzPolicyAssignment.ps1 +++ b/Src/Private/Get-AbrAzPolicyAssignment.ps1 @@ -1,11 +1,11 @@ function Get-AbrAzPolicyAssignment { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Policy Assignment information + Used by As Built Report to retrieve Azure Policy Assignment information .DESCRIPTION .NOTES - Version: 0.1.0 + Version: 0.1.1 Author: Tim Carman Twitter: @tpcarman Github: tpcarman @@ -19,49 +19,110 @@ function Get-AbrAzPolicyAssignment { ) begin { - Write-PscriboMessage "Collecting Azure Policy Assignment information." + Write-PScriboMessage "Policy Assignments InfoLevel set at $($InfoLevel.Policy.Assignments)." } process { - $AzPolicyAssignments = Get-AzPolicyAssignment - if (($InfoLevel.PolicyAssignment -gt 0) -and ($AzPolicyAssignments)) { - Section -Style Heading4 'Policy Assignments' { - $AzPolicyAssignmentInfo = @() - foreach ($AzPolicyAssignment in $AzPolicyAssignments) { - $InObj = [Ordered]@{ - 'Name' = $AzPolicyAssignment.Properties.DisplayName - 'Description' = Switch ($AzPolicyAssignment.Properties.Description) { - $null { '--' } - default { $AzPolicyAssignment.Properties.Description } - } - 'Scope' = ($AzPolicyAssignment.Properties.Scope).Split('/')[-1] - 'Location' = Switch ($AzPolicyAssignment.Location) { - $null { '--' } - default {$AzLocationLookup."$($AzPolicyAssignment.Location)"} + Try { + if ($InfoLevel.Policy.Assignments -gt 0) { + Write-PScriboMessage "Collecting Azure Policy Assignment information." + $AzPolicyAssignments = Get-AzPolicyAssignment | Sort-Object DisplayName + if ($AzPolicyAssignments) { + Section -Style NOTOCHeading5 -ExcludeFromTOC 'Assignments' { + $AzPolicyDefinitions = Get-AzPolicyDefinition + $AzInitiativeDefinitions = Get-AzPolicySetDefinition + $AzPolicyAssignmentInfo = @() + foreach ($AzPolicyAssignment in $AzPolicyAssignments) { + $AzPolicyDefId = $AzPolicyAssignment.PolicyDefinitionId + $AzPolicyDef = $AzPolicyDefinitions | Where-Object { $_.Id -eq $AzPolicyDefId } + $AzInitiativeDef = $AzInitiativeDefinitions | Where-Object { $_.Id -eq $AzPolicyDefId } + $InObj = [Ordered]@{ + 'Name' = $AzPolicyAssignment.DisplayName + 'Description' = if ($AzPolicyAssignment.Description) { + $AzPolicyAssignment.Description + } else { + '--' + } + 'Location' = if ($AzPolicyAssignment.Location) { + $AzLocationLookup."$($AzPolicyAssignment.Location)" + } else { + '--' + } + 'Scope' = Switch -Wildcard ($AzPolicyAssignment.Scope) { + "*subscriptions*" { "$($AzSubscriptionLookup.(($AzPolicyAssignment.Scope).split('/')[-1]))" } + default { $AzPolicyAssignment.Scope } + } + + 'Excluded Scopes' = Switch -Wildcard ($AzPolicyAssignment.NotScope | Where-Object { $_ -ne $null -and $_ -ne "" }) { + $null { '--' } + "*subscriptions*" { + ($AzPolicyAssignment.NotScope | ForEach-Object { + $SubscriptionId = $_.split('/')[-1] + $AzSubscriptionLookup[$SubscriptionId] + }) -join ', ' + } + default { $AzPolicyAssignment.NotScope } + } + <# + 'Excluded Scopes' = if ($AzPolicyAssignment.NotScope) { + ($AzPolicyAssignment.NotScope | Where-Object { $_ -ne $null -and $_ -ne "" }) -join ', ' + } else { + '--' + } + #> + 'Definition Type' = if ($AzPolicyDef) { + 'Policy' + } elseif ($AzInitiativeDef) { + 'Initiative' + } else { + 'Unknown' + } + 'Policy Enforcement' = if ($AzPolicyAssignment.EnforcementMode -eq 'Default') { + 'Enforce' + } else { + 'Do Not Enforce' + } + } + $AzPolicyAssignmentInfo += [PSCustomObject]$InObj } - 'Excluded Scopes' = Switch ($AzPolicyAssignment.Properties.NotScopes) { - $null { '--' } - default { ($AzPolicyAssignment.Properties.NotScopes).Split('/')[-1] } + + if ($InfoLevel.Policy.Assignments -ge 2) { + Paragraph "The following sections detail the policy assignments within the $($AzSubscription.Name) subscription." + foreach ($AzPolicy in $AzPolicyAssignmentInfo) { + Section -Style NOTOCHeading6 -ExcludeFromTOC "$($AzPolicy.Name)" { + $TableParams = @{ + Name = "Policy Assignment - $($AzPolicy.Name)" + List = $true + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzPolicy | Table @TableParams + } + } + } else { + Paragraph "The following table summarises the configuration of the policy assignments within the $($AzSubscription.Name) subscription." + BlankLine + $TableParams = @{ + Name = "Policy Assignments - $($AzSubscription.Name)" + List = $false + Columns = 'Name', 'Scope', 'Definition Type' + Headers = 'Name', 'Scope', 'Type' + ColumnWidths = 55, 30, 15 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzPolicyAssignmentInfo | Table @TableParams } } - $AzPolicyAssignmentInfo += [PSCustomObject]$InObj } - - Paragraph "The following table summarises the policy assignments within the $($AzSubscription.Name) subscription." - BlankLine - $TableParams = @{ - Name = "Policy Assignments - $($AzSubscription.Name)" - List = $false - ColumnWidths = 20, 20, 20, 20, 20 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" - } - $AzPolicyAssignmentInfo | Sort-Object Name | Table @TableParams } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } end {} - } \ No newline at end of file diff --git a/Src/Private/Get-AbrAzPolicyDefinition.ps1 b/Src/Private/Get-AbrAzPolicyDefinition.ps1 new file mode 100644 index 0000000..78348a1 --- /dev/null +++ b/Src/Private/Get-AbrAzPolicyDefinition.ps1 @@ -0,0 +1,85 @@ +function Get-AbrAzPolicyDefinition { + <# + .SYNOPSIS + Used by As Built Report to retrieve Azure Policy Definition information + .DESCRIPTION + + .NOTES + Version: 0.1.0 + Author: Tim Carman + Twitter: @tpcarman + Github: tpcarman + .EXAMPLE + + .LINK + + #> + [CmdletBinding()] + param ( + ) + + begin { + Write-PScriboMessage "Policy Definitions InfoLevel set at $($InfoLevel.Policy.Definitions)." + } + + process { + Try { + if ($InfoLevel.Policy.Definitions -gt 0) { + Write-PScriboMessage "Collecting Azure Policy Definition information." + $AzPolicyDefinitions = Get-AzPolicyDefinition | Sort-Object DisplayName + $AzInitiativeDefinitions = Get-AzPolicySetDefinition | Sort-Object DisplayName + if ($AzPolicyDefinitions -or $AzInitiativeDefinitions) { + Section -Style NOTOCHeading5 -ExcludeFromTOC 'Definitions' { + $AzPolicyDefinitionInfo = @() + foreach ($Definition in $AzInitiativeDefinitions) { + $InObj = [ordered]@{ + 'Name' = $Definition.DisplayName + 'Version' = $Definition.Version + 'Policies' = $Definition.PolicyDefinition.count + 'Type' = $Definition.PolicyType + 'Definition Type' = 'Initiative' + 'Category' = if ($Definition.Metadata.Category) { + $Definition.Metadata.Category + } else { + '--' + } + } + $AzPolicyDefinitionInfo += [pscustomobject]$InObj + } + foreach ($Definition in $AzPolicyDefinitions) { + $InObj = [ordered]@{ + 'Name' = $Definition.DisplayName + 'Version' = $Definition.Version + 'Policies' = $Definition.PolicyDefinition.count + 'Type' = $Definition.PolicyType + 'Definition Type' = 'Policy' + 'Category' = if ($Definition.Metadata.Category) { + $Definition.Metadata.Category + } else { + '--' + } + } + $AzPolicyDefinitionInfo += [pscustomobject]$InObj + } + + Paragraph "The following table summarises the policy definitions within the $($AzSubscription.Name) subscription." + BlankLine + $TableParams = @{ + Name = "Policy Definitions - $($AzSubscription.Name)" + List = $false + ColumnWidths = 40, 10, 10, 12, 12, 16 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzPolicyDefinitionInfo | Sort-Object Name | Table @TableParams + } + } + } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) + } + } + + end {} +} \ No newline at end of file diff --git a/Src/Private/Get-AbrAzRecoveryServicesVault.ps1 b/Src/Private/Get-AbrAzRecoveryServicesVault.ps1 index 696d623..0c642fa 100644 --- a/Src/Private/Get-AbrAzRecoveryServicesVault.ps1 +++ b/Src/Private/Get-AbrAzRecoveryServicesVault.ps1 @@ -1,11 +1,11 @@ function Get-AbrAzRecoveryServicesVault { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Recovery Services Vault information + Used by As Built Report to retrieve Azure Recovery Services Vault information .DESCRIPTION .NOTES - Version: 0.1.1 + Version: 0.1.2 Author: Tim Carman Twitter: @tpcarman Github: tpcarman @@ -23,64 +23,70 @@ function Get-AbrAzRecoveryServicesVault { } process { - $AzRsvs = Get-AzRecoveryServicesVault | Sort-Object Name - if (($InfoLevel.RecoveryServicesVault -gt 0) -and ($AzRsvs)) { - Write-PscriboMessage "Collecting Azure Recovery Services Vault information." - Section -Style Heading4 'Recovery Services Vaults' { - if ($Options.ShowSectionInfo) { - Paragraph "A Recovery Services vault is a storage entity in Azure that houses data. The data is typically copies of data, or configuration information for virtual machines (VMs), workloads, servers, or workstations. You can use Recovery Services vaults to hold backup data for various Azure services such as IaaS VMs (Linux or Windows) and SQL Server in Azure VMs. Recovery Services vaults support System Center DPM, Windows Server, Azure Backup Server, and more. Recovery Services vaults make it easy to organize your backup data, while minimizing management overhead." - BlankLine - } - $AzRsvInfo = @() - foreach ($AzRsv in $AzRsvs) { - $InObj = [Ordered]@{ - 'Name' = $AzRsv.Name - 'Resource Group' = $AzRsv.ResourceGroupName - 'Location' = $AzLocationLookup."$($AzRsv.Location)" - 'Subscription' = "$($AzSubscriptionLookup.(($AzRsv.Id).split('/')[2]))" - 'Provisioning State' = $AzRsv.Properties.ProvisioningState - 'Private Endpoint State for Backup' = Switch ($AzRsv.Properties.PrivateEndpointStateForBackup) { - $null { '--' } - default { $AzRsv.Properties.PrivateEndpointStateForBackup } + Try { + if ($InfoLevel.RecoveryServicesVault -gt 0) { + $AzRsvs = Get-AzRecoveryServicesVault | Sort-Object Name + if ($AzRsvs) { + Write-PscriboMessage "Collecting Azure Recovery Services Vault information." + Section -Style Heading4 'Recovery Services Vaults' { + if ($Options.ShowSectionInfo) { + Paragraph "A Recovery Services vault is a storage entity in Azure that houses data. The data is typically copies of data, or configuration information for virtual machines (VMs), workloads, servers, or workstations. You can use Recovery Services vaults to hold backup data for various Azure services such as IaaS VMs (Linux or Windows) and SQL Server in Azure VMs. Recovery Services vaults support System Center DPM, Windows Server, Azure Backup Server, and more. Recovery Services vaults make it easy to organize your backup data, while minimizing management overhead." + BlankLine } - 'Private Endpoint State for Site Recovery' = Switch ($AzRsv.Properties.PrivateEndpointStateForSiteRecovery) { - $null { '--' } - default { $AzRsv.Properties.PrivateEndpointStateForSiteRecovery } + $AzRsvInfo = @() + foreach ($AzRsv in $AzRsvs) { + $InObj = [Ordered]@{ + 'Name' = $AzRsv.Name + 'Resource Group' = $AzRsv.ResourceGroupName + 'Location' = $AzLocationLookup."$($AzRsv.Location)" + 'Subscription' = "$($AzSubscriptionLookup.(($AzRsv.Id).split('/')[2]))" + 'Provisioning State' = $AzRsv.Properties.ProvisioningState + 'Private Endpoint State for Backup' = Switch ($AzRsv.Properties.PrivateEndpointStateForBackup) { + $null { '--' } + default { $AzRsv.Properties.PrivateEndpointStateForBackup } + } + 'Private Endpoint State for Site Recovery' = Switch ($AzRsv.Properties.PrivateEndpointStateForSiteRecovery) { + $null { '--' } + default { $AzRsv.Properties.PrivateEndpointStateForSiteRecovery } + } + } + $AzRsvInfo += [PSCustomObject]$InObj } - } - $AzRsvInfo += [PSCustomObject]$InObj - } - if ($InfoLevel.RecoveryServicesVault -ge 2) { - Paragraph "The following sections detail the configuration of the recovery services vault within the $($AzSubscription.Name) subscription." - foreach ($AzRsv in $AzRsvInfo) { - Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzRsv.Name)" { + if ($InfoLevel.RecoveryServicesVault -ge 2) { + Paragraph "The following sections detail the configuration of the recovery services vault within the $($AzSubscription.Name) subscription." + foreach ($AzRsv in $AzRsvInfo) { + Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzRsv.Name)" { + $TableParams = @{ + Name = "Recovery Services Vault - $($AzRsv.Name)" + List = $true + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzRsv | Table @TableParams + } + } + } else { + Paragraph "The following table summarises the configuration of the recovery services vault within the $($AzSubscription.Name) subscription." + BlankLine $TableParams = @{ - Name = "Recovery Services Vault - $($AzRsv.Name)" - List = $true - ColumnWidths = 50, 50 + Name = "Recovery Services Vaults - $($AzSubscription.Name)" + List = $false + Columns = 'Name', 'Resource Group', 'Location' + ColumnWidths = 33, 34, 33 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } - $AzRsv | Table @TableParams + $AzRsvinfo | Table @TableParams } } - } else { - Paragraph "The following table summarises the configuration of the recovery services vault within the $($AzSubscription.Name) subscription." - BlankLine - $TableParams = @{ - Name = "Recovery Services Vaults - $($AzSubscription.Name)" - List = $false - Columns = 'Name', 'Resource Group', 'Location' - ColumnWidths = 33, 34, 33 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" - } - $AzRsvinfo | Table @TableParams } } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzRouteTable.ps1 b/Src/Private/Get-AbrAzRouteTable.ps1 index ef875aa..e7c2510 100644 --- a/Src/Private/Get-AbrAzRouteTable.ps1 +++ b/Src/Private/Get-AbrAzRouteTable.ps1 @@ -1,13 +1,13 @@ function Get-AbrAzRouteTable { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Route Table and Routes information + Used by As Built Report to retrieve Azure Route Table and Routes information .DESCRIPTION .NOTES - Version: 0.2 + Version: 0.3.0 Author: Howard Hao & Tim Carman - Twitter: tpcarman + Twitter: @tpcarman Github: howardhaooooo / tpcarman .EXAMPLE @@ -23,78 +23,119 @@ function Get-AbrAzRouteTable { } process { - $AzRouteTables = Get-AzRouteTable | Sort-Object Name - if (($InfoLevel.RouteTable -gt 0) -and ($AzRouteTables)) { - Write-PscriboMessage "Collecting Azure Route Table information." - Section -Style Heading4 'Route Tables' { - if ($Options.ShowSectionInfo) { - Paragraph "Azure Route Tables are a set of custom routes that dictate how network traffic should move within a virtual network (VNet). They offer a way to control the flow of data, ensuring it reaches the correct endpoint. For instance, if a subnet in a VNet needs to communicate with a virtual appliance, an Azure Route Table can direct the traffic accordingly." - BlankLine - } - $AzRouteTableInfo = @() - foreach ($AzRouteTable in $AzRouteTables) { - $InObj = [Ordered]@{ - 'Name' = $AzRouteTable.Name - 'Resource Group' = $AzRouteTable.ResourceGroupName - 'Location' = $AzLocationLookup."$($AzRouteTable.Location)" - 'Subscription' = "$($AzSubscriptionLookup.(($AzRouteTable.Id).split('/')[2]))" - 'Provisioning State' = $AzRouteTable.ProvisioningState - } - $AzRouteTableInfo += [PSCustomObject]$InObj - } + Try { + if ($InfoLevel.RouteTable -gt 0) { + $AzRouteTables = Get-AzRouteTable | Sort-Object Name + if ($AzRouteTables) { + Write-PscriboMessage "Collecting Azure Route Table information." + Section -Style Heading4 'Route Tables' { + if ($Options.ShowSectionInfo) { + Paragraph "Azure Route Tables are a set of custom routes that dictate how network traffic should move within a virtual network (VNet). They offer a way to control the flow of data, ensuring it reaches the correct endpoint. For instance, if a subnet in a VNet needs to communicate with a virtual appliance, an Azure Route Table can direct the traffic accordingly." + BlankLine + } - if ($InfoLevel.RouteTable -eq 1) { - Paragraph "The following table summarises the configuration of the Route Table within the $($AzSubscription.Name) subscription." - BlankLine - } else { - Paragraph "The following sections detail the configuration of the Route Tables within the $($AzSubscription.Name) subscription." - BlankLine - } - $TableParams = @{ - Name = "Route Tables - $($AzSubscription.Name)" - List = $false - Columns = 'Name', 'Resource Group', 'Location', 'Subscription' - ColumnWidths = 25, 25, 25, 25 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" - } - $AzRouteTableInfo | Table @TableParams - - if ($InfoLevel.RouteTable -ge 2) { - foreach ($AzRouteTable in $AzRouteTables) { - $AzRoutes = $AzRouteTable.Routes | Sort-Object Name - if ($AzRoutes) { - Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzRouteTable.Name)" { - Section -Style NOTOCHeading6 -ExcludeFromTOC "Routes" { - $AzRouteInfo = @() - foreach ($AzRoute in $AzRoutes){ - $InObj = [Ordered]@{ - 'Name' = $AzRoute.Name - 'Address Prefix' = $AzRoute.AddressPrefix - 'Next Hop Type' = $AzRoute.NextHopType - 'Next Hop IP Address' = Switch ($AzRoute.NextHopIpAddress) { - "" { '--' } - default { $AzRoute.NextHopIpAddress } - } - } - $AzRouteInfo += [PSCustomObject]$InObj + if ($InfoLevel.RouteTable -ge 3) { + Paragraph "The following sections detail the configuration of the Route Tables within the $($AzSubscription.Name) subscription." + BlankLine + + foreach ($AzRouteTable in $AzRouteTables) { + Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzRouteTable.Name)" { + $AzRouteTableInfo = @() + $InObj = [Ordered]@{ + 'Name' = $AzRouteTable.Name + 'Resource Group' = $AzRouteTable.ResourceGroupName + 'Location' = $AzLocationLookup."$($AzRouteTable.Location)" + 'Subscription' = "$($AzSubscriptionLookup.(($AzRouteTable.Id).split('/')[2]))" + 'Provisioning State' = $AzRouteTable.ProvisioningState } + $TableParams = @{ - Name = "Routes - $($AzRouteTable.Name)" - List = $false - ColumnWidths = 25, 25, 25, 25 + Name = "Route Table - $($AzRouteTable.Name)" + List = $true + ColumnWidths = 40, 60 + } + + if ($Options.ShowTags) { + $InObj['Tags'] = if ([string]::IsNullOrEmpty($AzRouteTable.Tag)) { + 'None' + } else { + ($AzRouteTable.Tag.GetEnumerator() | ForEach-Object { "$($_.Name):`t$($_.Value)" }) -join [Environment]::NewLine + } + $TableParams['Columns'] = 'Name', 'Resource Group', 'Location', 'Subscription', 'Tags' + } else { + $TableParams['Columns'] = 'Name', 'Resource Group', 'Location', 'Subscription' } + if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } - $AzRouteInfo | Table @TableParams + + $AzRouteTableInfo += [PSCustomObject]$InObj + $AzRouteTableInfo | Table @TableParams + } + + $AzRoutes = $AzRouteTable.Routes | Sort-Object Name + if ($AzRoutes) { + Section -Style NOTOCHeading6 -ExcludeFromTOC "Routes" { + $AzRouteInfo = @() + foreach ($AzRoute in $AzRoutes){ + $InObj = [Ordered]@{ + 'Name' = $AzRoute.Name + 'Address Prefix' = $AzRoute.AddressPrefix + 'Next Hop Type' = $AzRoute.NextHopType + 'Next Hop IP Address' = Switch ($AzRoute.NextHopIpAddress) { + "" { '--' } + default { $AzRoute.NextHopIpAddress } + } + } + $AzRouteInfo += [PSCustomObject]$InObj + } + $TableParams = @{ + Name = "Routes - $($AzRouteTable.Name)" + List = $false + ColumnWidths = 25, 25, 25, 25 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzRouteInfo | Table @TableParams + } } } + } else { + Paragraph "The following table summarises the configuration of the Route Table within the $($AzSubscription.Name) subscription." + BlankLine + + $AzRouteTableInfo = @() + foreach ($AzRouteTable in $AzRouteTables) { + $InObj = [Ordered]@{ + 'Name' = $AzRouteTable.Name + 'Resource Group' = $AzRouteTable.ResourceGroupName + 'Location' = $AzLocationLookup."$($AzRouteTable.Location)" + 'Subscription' = "$($AzSubscriptionLookup.(($AzRouteTable.Id).split('/')[2]))" + 'Provisioning State' = $AzRouteTable.ProvisioningState + } + $AzRouteTableInfo += [PSCustomObject]$InObj + } + + $TableParams = @{ + Name = "Route Tables - $($AzSubscription.Name)" + List = $false + Columns = 'Name', 'Resource Group', 'Location', 'Subscription' + ColumnWidths = 25, 25, 25, 25 + } + + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + + $AzRouteTableInfo | Table @TableParams } } } } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzSABlobServiceProperty.ps1 b/Src/Private/Get-AbrAzSABlobServiceProperty.ps1 index 1501170..6f9b5da 100644 --- a/Src/Private/Get-AbrAzSABlobServiceProperty.ps1 +++ b/Src/Private/Get-AbrAzSABlobServiceProperty.ps1 @@ -1,14 +1,14 @@ function Get-AbrAzSABlobServiceProperty { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Storage Account Blob Service Property information + Used by As Built Report to retrieve Azure Storage Account Blob Service Property information .DESCRIPTION .NOTES - Version: 0.1.5 - Author: Jonathan Colon - Twitter: @jcolonfzenpr - Github: rebelinux + Version: 0.1.6 + Author: Jonathan Colon / Tim Carman + Twitter: @jcolonfzenpr / @tpcarman + Github: rebelinux / tpcarman .EXAMPLE .LINK @@ -30,48 +30,88 @@ function Get-AbrAzSABlobServiceProperty { [String] $StorageAccountName ) - begin { - Write-PScriboMessage "StorageAccount InfoLevel set at $($InfoLevel.StorageAccount)." - } + begin {} process { - $AzSABlobServiceProperties = Get-AzStorageBlobServiceProperty -ResourceGroupName $ResourceGroupName -StorageAccountName $StorageAccountName - if (($InfoLevel.StorageAccount -gt 0) -and ($AzSABlobServiceProperties)) { - Write-PscriboMessage "Collecting Azure Storage Account Blob Service Property information." - Section -Style NOTOCHeading6 -ExcludeFromTOC 'Blob Service Property' { - $AzSASrvPrtyInfo = @() - foreach ($AzSABlobServiceProperty in $AzSABlobServiceProperties) { - $InObj = [Ordered]@{ - 'Blob Soft Delete Status' = Switch ($AzSABlobServiceProperty.DeleteRetentionPolicy.Enabled) { - $true { 'Enabled' } - $false { 'Not Enabled' } - $null { 'Not Enabled' } - } - 'Blob Soft Delete Days' = "$($AzSABlobServiceProperty.DeleteRetentionPolicy.Days) days" - 'Container Soft Delete Status' = Switch ($AzSABlobServiceProperty.ContainerDeleteRetentionPolicy.Enabled) { - $true { 'Enabled' } - $false { 'Not Enabled' } - $null { 'Not Enabled' } + Try { + $AzSABlobServiceProperty = Get-AzStorageBlobServiceProperty -ResourceGroupName $ResourceGroupName -StorageAccountName $StorageAccountName + $AzStorageAccount = Get-AzStorageAccount -Name $AzSABlobServiceProperty.StorageAccountName -ResourceGroupName $AzSABlobServiceProperty.ResourceGroupName + if ($AzSABlobServiceProperty -and $AzStorageAccount) { + Write-PScriboMessage "Collecting Azure Storage Account Blob Service information [$($AzStorageAccount.StorageAccountName)]." + Section -Style NOTOCHeading6 -ExcludeFromTOC 'Blob Service' { + $AzSABlobServicePropertyInfo = @() + foreach ($AzSABlobService in $AzSABlobServiceProperty) { + $InObj = [Ordered]@{ + 'Hierarchical Namespace' = if ($AzStorageAccount.EnableHierarchicalNamespace) { + 'Enabled' + } else { + 'Disabled' + } + 'Default Access Tier' = if ($null -ne $AzStorageAccount.AccessTier) { + $AzStorageAccount.AccessTier + } else { + 'Not Applicable' + } + 'Blob Anonymous Access' = if ($AzStorageAccount.AllowBlobPublicAccess) { + 'Enabled' + } else { + 'Disabled' + } + 'Blob Soft Delete' = If ($AzSABlobService.DeleteRetentionPolicy.Enabled -and $AzSABlobService.DeleteRetentionPolicy.Days) { + "Enabled ($($AzSABlobService.DeleteRetentionPolicy.Days) days)" + } else { + 'Disabled' + } + 'Container Soft Delete' = If ($AzSABlobService.ContainerDeleteRetentionPolicy.Enabled -and $AzSABlobService.ContainerDeleteRetentionPolicy.Days) { + "Enabled ($($AzSABlobService.ContainerDeleteRetentionPolicy.Days) days)" + } else { + 'Disabled' + } + 'Versioning' = if ($AzSABlobService.IsVersioningEnabled) { + 'Enabled' + } else { + 'Disabled' + } + 'Change Feed' = if ($AzSABlobService.ChangeFeed.Enabled -and $AzSABlobService.ChangeFeed.RetentionInDays) { + "Enabled ($($AzSABlobService.ChangeFeed.RetentionInDays) days)" + } else { + 'Disabled' + } + 'NFS v3' = if ($AzStorageAccount.EnableNfsV3) { + 'Enabled' + } else { + 'Disabled' + } + 'SFTP' = if ($AzStorageAccount.EnableSftp) { + 'Enabled' + } else { + 'Disabled' + } + 'Allow Cross-Tenant Replication' = if ($AzStorageAccount.AllowCrossTenantReplication) { + 'Enabled' + } else { + 'Disabled' + } } - 'Container Soft Delete Days' = "$($AzSABlobServiceProperty.ContainerDeleteRetentionPolicy.Days) days" - 'Is Versioning Enabled' = Switch ($AzSABlobServiceProperty.IsVersioningEnabled) { - $true { 'Enabled' } - $false { 'Not Enabled' } - $null { 'Not Enabled' } + $AzSABlobServicePropertyInfo += [PSCustomObject]$InObj + + if ($Healthcheck.StorageAccount.BlobAnonymousAccess) { + $AzSABlobServicePropertyInfo | Where-Object { $_.'Blob Anonymous Access' -eq 'Enabled' } | Set-Style -Style Warning -Property 'Blob Anonymous Access' } } - $AzSASrvPrtyInfo = [PSCustomObject]$InObj - } - $TableParams = @{ - Name = "Blob Service Property - $($AzSABlobServiceProperty.StorageAccountName)" - List = $true - ColumnWidths = 50, 50 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" + $TableParams = @{ + Name = "Blob Service - $($AzSABlobService.StorageAccountName)" + List = $true + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzSABlobServicePropertyInfo | Table @TableParams } - $AzSASrvPrtyInfo | Table @TableParams } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzSAContainer.ps1 b/Src/Private/Get-AbrAzSAContainer.ps1 index 7612936..225d464 100644 --- a/Src/Private/Get-AbrAzSAContainer.ps1 +++ b/Src/Private/Get-AbrAzSAContainer.ps1 @@ -1,14 +1,14 @@ function Get-AbrAzSAContainer { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Storage Account Container information + Used by As Built Report to retrieve Azure Storage Account Container information .DESCRIPTION .NOTES - Version: 0.1.5 - Author: Jonathan Colon - Twitter: @jcolonfzenpr - Github: rebelinux + Version: 0.1.6 + Author: Jonathan Colon / Tim Carman + Twitter: @jcolonfzenpr / @tpcarman + Github: rebelinux / tpcarman .EXAMPLE .LINK @@ -31,40 +31,43 @@ function Get-AbrAzSAContainer { ) begin { - Write-PScriboMessage "StorageAccount InfoLevel set at $($InfoLevel.StorageAccount)." } process { - $AzSAContainers = Get-AzStorageAccount -ResourceGroupName $ResourceGroupName -StorageAccountName $StorageAccountName | Get-AzStorageContainer | Sort-Object Name - if (($InfoLevel.StorageAccount -gt 0) -and ($AzSAContainers)) { - Write-PscriboMessage "Collecting Azure Storage Account Containers information." - Section -Style NOTOCHeading6 -ExcludeFromTOC 'Containers' { - $AzSAContInfo = @() - foreach ($AzSAContainer in $AzSAContainers) { - $InObj = [Ordered]@{ - 'Name' = $AzSAContainer.Name - 'Public Access' = Switch ($AzSAContainer.PublicAccess) { - 'Off' { 'Not Enabled' } - $null { 'Not Enabled' } - default {$AzSAContainer.PublicAccess} - } - 'Last Modified' = $AzSAContainer.LastModified.UtcDateTime.ToShortDateString() + Try { + $AzSAContainers = Get-AzStorageAccount -ResourceGroupName $ResourceGroupName -StorageAccountName $StorageAccountName | Get-AzStorageContainer -ErrorAction SilentlyContinue | Sort-Object Name + if ($AzSAContainers) { + Write-PscriboMessage "Collecting Azure Storage Account Containers information." + Section -Style NOTOCHeading6 -ExcludeFromTOC 'Containers' { + $AzSAContInfo = @() + foreach ($AzSAContainer in $AzSAContainers) { + $InObj = [Ordered]@{ + 'Name' = $AzSAContainer.Name + 'Public Access' = if ($AzSAContainer.PublicAccess) { + $AzSAContainer.PublicAccess + } else { + 'Disabled' + } + 'Last Modified' = $AzSAContainer.LastModified.UtcDateTime.ToShortDateString() + } + $AzSAContInfo += [PSCustomObject]$InObj } - $AzSAContInfo += [PSCustomObject]$InObj - } - $TableParams = @{ - Name = "Container - $($StorageAccountName)" - List = $false - Columns = 'Name', 'Public Access', 'Last Modified' - ColumnWidths = 50, 25, 25 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" + $TableParams = @{ + Name = "Container - $($StorageAccountName)" + List = $false + Columns = 'Name', 'Public Access', 'Last Modified' + ColumnWidths = 50, 25, 25 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzSAContInfo | Table @TableParams } - $AzSAContInfo | Table @TableParams } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzSAFileServiceProperty.ps1 b/Src/Private/Get-AbrAzSAFileServiceProperty.ps1 index b8f3fcc..fb9338b 100644 --- a/Src/Private/Get-AbrAzSAFileServiceProperty.ps1 +++ b/Src/Private/Get-AbrAzSAFileServiceProperty.ps1 @@ -1,14 +1,14 @@ function Get-AbrAzSAFileServiceProperty { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Storage Account File Service Property information + Used by As Built Report to retrieve Azure Storage Account File Service Property information .DESCRIPTION .NOTES - Version: 0.1.5 - Author: Jonathan Colon - Twitter: @jcolonfzenpr - Github: rebelinux + Version: 0.1.6 + Author: Jonathan Colon / Tim Carman + Twitter: @jcolonfzenpr / @tpcarman + Github: rebelinux / tpcarman .EXAMPLE .LINK @@ -31,36 +31,49 @@ function Get-AbrAzSAFileServiceProperty { ) begin { - Write-PScriboMessage "StorageAccount InfoLevel set at $($InfoLevel.StorageAccount)." } process { - $AzSAFileServiceProperties = Get-AzStorageFileServiceProperty -ResourceGroupName $ResourceGroupName -StorageAccountName $StorageAccountName - if (($InfoLevel.StorageAccount -gt 0) -and ($AzSAFileServiceProperties)) { - Write-PscriboMessage "Collecting Azure Storage Account File Service Property information." - Section -Style NOTOCHeading6 -ExcludeFromTOC 'File Service Property' { - $AzSASrvPrtyInfo = @() - foreach ($AzSAFileServiceProperty in $AzSAFileServiceProperties) { - $InObj = [Ordered]@{ - 'Soft Delete' = Switch ($AzSAFileServiceProperty.ShareDeleteRetentionPolicy.Enabled) { - $true { 'Enabled' } - $false { 'Not Enabled' } - $null { 'Not Enabled' } + Try { + $AzSAFileServiceProperty = Get-AzStorageFileServiceProperty -ResourceGroupName $ResourceGroupName -StorageAccountName $StorageAccountName + $AzStorageAccount = Get-AzStorageAccount -Name $AzSAFileServiceProperty.StorageAccountName -ResourceGroupName $AzSAFileServiceProperty.ResourceGroupName + if ($AzSAFileServiceProperty -and $AzStorageAccount) { + Write-PscriboMessage "Collecting Azure Storage Account File Service information [$($AzStorageAccount.StorageAccountName)]." + Section -Style NOTOCHeading6 -ExcludeFromTOC 'File Service' { + $AzSAFileServicePropertyInfo = @() + foreach ($AzSAFileService in $AzSAFileServiceProperty) { + $InObj = [Ordered]@{ + 'Large File Share' = If ($AzStorageAccount.LargeFileSharesState) { + 'Enabled' + } else { + 'Disabled' + } + 'Identity-based Access' = If ($AzStorageAccount.AzureFilesIdentityBasedAuth) { + 'Enabled' + } else { + 'Disabled' + } + 'Soft Delete' = if ($AzSAFileService.ShareDeleteRetentionPolicy.Enabled -and $AzSAFileService.ShareDeleteRetentionPolicy.Days) { + "Enabled ($($AzSAFileService.ShareDeleteRetentionPolicy.Days) days)" + } else { + 'Disabled' + } } - 'Soft Delete Days' = "$($AzSAFileServiceProperty.ShareDeleteRetentionPolicy.Days) days" + $AzSAFileServicePropertyInfo = [PSCustomObject]$InObj } - $AzSASrvPrtyInfo = [PSCustomObject]$InObj - } - $TableParams = @{ - Name = "File Service Property - $($AzSAFileServiceProperty.StorageAccountName)" - List = $true - ColumnWidths = 50, 50 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" + $TableParams = @{ + Name = "File Service - $($AzSAFileServiceProperty.StorageAccountName)" + List = $true + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzSAFileServicePropertyInfo | Table @TableParams } - $AzSASrvPrtyInfo | Table @TableParams } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzSAShare.ps1 b/Src/Private/Get-AbrAzSAShare.ps1 index 98e90ac..49d7e2d 100644 --- a/Src/Private/Get-AbrAzSAShare.ps1 +++ b/Src/Private/Get-AbrAzSAShare.ps1 @@ -1,14 +1,14 @@ function Get-AbrAzSAShare { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Storage Account Share information + Used by As Built Report to retrieve Azure Storage Account Share information .DESCRIPTION .NOTES - Version: 0.1.5 - Author: Jonathan Colon - Twitter: @jcolonfzenpr - Github: rebelinux + Version: 0.1.6 + Author: Jonathan Colon / Tim Carman + Twitter: @jcolonfzenpr / @tpcarman + Github: rebelinux / tpcarman .EXAMPLE .LINK @@ -31,48 +31,52 @@ function Get-AbrAzSAShare { ) begin { - Write-PScriboMessage "StorageAccount InfoLevel set at $($InfoLevel.StorageAccount)." } process { - $AzSAShares = Get-AzStorageAccount -ResourceGroupName $ResourceGroupName -StorageAccountName $StorageAccountName | Get-AzStorageShare | Sort-Object Name - if (($InfoLevel.StorageAccount -gt 0) -and ($AzSAShares)) { - Write-PscriboMessage "Collecting Azure Storage Account Shares information." - Section -Style NOTOCHeading6 -ExcludeFromTOC 'Shares' { - $AzSAShareInfo = @() - foreach ($AzSAShare in $AzSAShares) { - $InObj = [Ordered]@{ - 'Name' = $AzSAShare.Name - 'Quota' = Switch ([string]::IsNullOrEmpty($AzSAShare.ShareProperties.QuotaInGB)) { - $null { 'Unknown' } - default {"$($AzSAShare.ShareProperties.QuotaInGB / 1024) Tib"} + Try { + $AzSAShares = Get-AzStorageAccount -ResourceGroupName $ResourceGroupName -StorageAccountName $StorageAccountName | Get-AzStorageShare -ErrorAction SilentlyContinue | Sort-Object Name + if ($AzSAShares) { + Write-PscriboMessage "Collecting Azure Storage Account Shares information." + Section -Style NOTOCHeading6 -ExcludeFromTOC 'Shares' { + $AzSAShareInfo = @() + foreach ($AzSAShare in $AzSAShares) { + $InObj = [Ordered]@{ + 'Name' = $AzSAShare.Name + 'Share URL' = $AzSAShare.CloudFileShare.Uri.AbsoluteUri + 'Quota' = if ([string]::IsNullOrEmpty($AzSAShare.ShareProperties.QuotaInGB)) { + 'Unknown' + } else { + "$($AzSAShare.ShareProperties.QuotaInGB / 1024) Tib" + } + 'Access Tier' = Switch ($AzSAShare.ShareProperties.AccessTier) { + 'TransactionOptimized' { 'Transaction Optimized' } + default {$AzSAShare.ShareProperties.AccessTier} + } + 'Last Modified' = $AzSAShare.LastModified.UtcDateTime.ToShortDateString() + 'Snapshot' = if ($AzSAShare.IsSnapshot) { + 'Enabled' + } else { + 'Disabled' + } } - 'Access Tier' = Switch ($AzSAShare.ShareProperties.AccessTier) { - 'TransactionOptimized' { 'Transaction Optimized' } - default {$AzSAShare.ShareProperties.AccessTier} - } - 'Last Modified' = $AzSAShare.LastModified.UtcDateTime.ToShortDateString() - 'Is Snapshot' = Switch ($AzSAShare.IsSnapshot) { - 'False' { 'Not Enabled' } - 'True' { 'Enabled' } - default {$AzSAShare.IsSnapshot} - } - + $AzSAShareInfo += [PSCustomObject]$InObj } - $AzSAShareInfo += [PSCustomObject]$InObj - } - $TableParams = @{ - Name = "Shares - $($StorageAccountName)" - List = $false - Columns = 'Name', 'Access Tier', 'Quota', 'Last Modified', 'Is Snapshot' - ColumnWidths = 28, 27, 15, 15, 15 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" + $TableParams = @{ + Name = "Shares - $($StorageAccountName)" + List = $false + Columns = 'Name', 'Access Tier', 'Quota', 'Last Modified', 'Snapshot' + ColumnWidths = 28, 27, 15, 15, 15 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzSAShareInfo | Table @TableParams } - $AzSAShareInfo | Table @TableParams } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzStorageAccount.ps1 b/Src/Private/Get-AbrAzStorageAccount.ps1 index 8b000ed..e29506e 100644 --- a/Src/Private/Get-AbrAzStorageAccount.ps1 +++ b/Src/Private/Get-AbrAzStorageAccount.ps1 @@ -1,14 +1,14 @@ function Get-AbrAzStorageAccount { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Storage Account information + Used by As Built Report to retrieve Azure Storage Account information .DESCRIPTION .NOTES - Version: 0.1.5 - Author: Jonathan Colon - Twitter: @jcolonfzenpr - Github: rebelinux + Version: 0.1.6 + Author: Jonathan Colon / Tim Carman + Twitter: @jcolonfzenpr / @tpcarman + Github: rebelinux / tpcarman .EXAMPLE .LINK @@ -23,121 +23,143 @@ function Get-AbrAzStorageAccount { } process { - $AzStorageAccounts = Get-AzStorageAccount | Sort-Object StorageAccountName - if (($InfoLevel.StorageAccount -gt 0) -and ($AzStorageAccounts)) { - Write-PscriboMessage "Collecting Azure Storage Account information." - Section -Style Heading4 'Storage Account' { - if ($Options.ShowSectionInfo) { - Paragraph "Azure storage account contains all of your Azure Storage data objects, including blobs, file shares, queues, tables, and disks. The storage account provides a unique namespace for your Azure Storage data that's accessible from anywhere in the world over HTTP or HTTPS. Data in your storage account is durable and highly available, secure, and massively scalable." - BlankLine - } - $AzSAInfo = @() - foreach ($AzStorageAccount in $AzStorageAccounts) { - $InObj = [Ordered]@{ - 'Name' = $AzStorageAccount.StorageAccountName - 'Resource Group' = $AzStorageAccount.ResourceGroupName - 'Location' = $AzLocationLookup."$($AzStorageAccount.Location)" - 'Primary/Secondary Location' = "Primary: $($AzLocationLookup."$($AzStorageAccount.PrimaryLocation)") / Secondary: $($AzLocationLookup."$($AzStorageAccount.SecondaryLocation)")" - 'Disk state' = "Primary: $($AzStorageAccount.StatusOfPrimary) / Secondary: $($AzStorageAccount.StatusOfSecondary)" - 'Sku Name' = Switch ($AzStorageAccount.Sku.Name) { - 'Standard_LRS' { 'Locally-redundant storage.' } - 'Standard_ZRS' { 'Zone-redundant storage' } - 'Standard_GRS' { 'Geo-redundant storage' } - 'Standard_RAGRS' { 'Read access geo-redundant storage' } - 'Premium_LRS' { 'Premium locally-redundant storage' } - 'Premium_ZRS' { 'Premium zone-redundant storage' } - 'Standard_GZRS' { 'Geo-redundant zone-redundant storage' } - 'Standard_RAGZRS' { 'Read access geo-redundant zone-redundant storage' } - default {'Unknown'} - } - 'Sku Tier' = $AzStorageAccount.Sku.Tier - 'Account Kind' = Switch ($AzStorageAccount.Kind) { - 'Storage' {'General Purpose Version'} - 'StorageV2' {'General Purpose Version 2'} - 'BlobStorage' {'Blob Storage'} - 'BlockBlobStorage' {'Block Blob Storage'} - 'FileStorage' {'File Storage'} - default {'Unknown'} - } - 'Provisioning State' = $AzStorageAccount.ProvisioningState - 'Enable Https Traffic Only' = Switch ($AzStorageAccount.EnableHttpsTrafficOnly) { - $true { 'Enabled' } - $false { 'Not Enabled' } - $null { 'Not Enabled' } + Try { + if ($InfoLevel.StorageAccount -gt 0) { + $AzStorageAccounts = Get-AzStorageAccount | Sort-Object StorageAccountName + if ($AzStorageAccounts) { + Write-PscriboMessage "Collecting Azure Storage Account information." + Section -Style Heading4 'Storage Account' { + if ($Options.ShowSectionInfo) { + Paragraph "Azure storage account contains all of your Azure Storage data objects, including blobs, file shares, queues, tables, and disks. The storage account provides a unique namespace for your Azure Storage data that's accessible from anywhere in the world over HTTP or HTTPS. Data in your storage account is durable and highly available, secure, and massively scalable." + BlankLine } - 'Allow Blob Public Access' = Switch ($AzStorageAccount.AllowBlobPublicAccess) { - $true { 'Enabled' } - $false { 'Not Enabled' } - $null { 'Not Enabled' } - } - 'Allow Shared Key Access' = Switch ($AzStorageAccount.AllowSharedKeyAccess) { - $true { 'Enabled' } - $false { 'Not Enabled' } - $null { 'Not Enabled' } + $AzStorageAccountInfo = @() + foreach ($AzStorageAccount in $AzStorageAccounts) { + $InObj = [Ordered]@{ + 'Name' = $AzStorageAccount.StorageAccountName + 'Resource Group' = $AzStorageAccount.ResourceGroupName + 'Location' = $AzLocationLookup."$($AzStorageAccount.Location)" + 'Subscription' = "$($AzSubscriptionLookup.(($AzStorageAccount.Id).split('/')[2]))" + 'Primary/Secondary Location' = "Primary: $($AzLocationLookup."$($AzStorageAccount.PrimaryLocation)"), Secondary: $($AzLocationLookup."$($AzStorageAccount.SecondaryLocation)")" + 'Disk state' = "Primary: $($AzStorageAccount.StatusOfPrimary), Secondary: $($AzStorageAccount.StatusOfSecondary)" + 'Performance' = $AzStorageAccount.Sku.Tier + 'Replication' = Switch ($AzStorageAccount.Sku.Name) { + 'Standard_LRS' { 'Locally-redundant storage (LRS)' } + 'Standard_ZRS' { 'Zone-redundant storage (ZRS)' } + 'Standard_GRS' { 'Geo-redundant storage (GRS)' } + 'Standard_RAGRS' { 'Read access geo-redundant storage (RA-GRS)' } + 'Premium_LRS' { 'Premium locally-redundant storage (Premium LRS)' } + 'Premium_ZRS' { 'Premium zone-redundant storage (Premium ZRS)' } + 'Standard_GZRS' { 'Geo-redundant zone-redundant storage (GZRS)' } + 'Standard_RAGZRS' { 'Read access geo-redundant zone-redundant storage (RA-GZRS)' } + default {'Unknown'} + } + 'Account Kind' = Switch ($AzStorageAccount.Kind) { + 'Storage' {'Storage (General Purpose v1)'} + 'StorageV2' {'Storage (General Purpose v2)'} + 'BlobStorage' {'Blob Storage'} + 'BlockBlobStorage' {'Block Blob Storage'} + 'FileStorage' {'File Storage'} + default {'Unknown'} + } + 'Provisioning State' = $AzStorageAccount.ProvisioningState + 'Secure Transfer' = if ($AzStorageAccount.EnableHttpsTrafficOnly) { + 'Enabled' + } else { + 'Disabled' + } + 'Storage Account Key Access' = if ($AzStorageAccount.AllowSharedKeyAccess) { + 'Enabled' + } else { + 'Disabled' + } + 'Public Network Access' = if ($AzStorageAccount.PublicNetworkAccess) { + 'Enabled' + } else { + 'Disabled' + } + 'Minimum TLS Version' = ($AzStorageAccount.MinimumTlsVersion).Replace('_','.') + 'Infrastructure Encryption' = if ($AzStorageAccount.RequireInfrastructureEncryption) { + 'Enabled' + } else { + 'Disabled' + } + 'Created' = $AzStorageAccount.CreationTime + } + + if ($Options.ShowTags) { + $InObj['Tags'] = if ([string]::IsNullOrEmpty($AzStorageAccount.Tags)) { + 'None' + } else { + ($AzStorageAccount.Tags.GetEnumerator() | ForEach-Object {"$($_.Key):`t$($_.Value)"}) -join [Environment]::NewLine + } + } + + $AzStorageAccountInfo += [PSCustomObject]$InObj } - 'Public Network Access' = $AzStorageAccount.PublicNetworkAccess - 'Minimum TLS Version' = $AzStorageAccount.MinimumTlsVersion - 'Default Access Tier' = $AzStorageAccount.AccessTier - 'Creation Time' = $AzStorageAccount.CreationTime - 'Tags' = Switch ([string]::IsNullOrEmpty($AzStorageAccount.Tags)) { - $true {"--"} - default {($AzStorageAccount.Tags.GetEnumerator() | ForEach-Object {"$($_.Key):$($_.Value)"}) -join ", "} + + if ($Healthcheck.StorageAccount.ProvisioningState) { + $AzStorageAccountInfo | Where-Object { $_.'Provisioning State' -ne 'Succeeded' } | Set-Style -Style Critical -Property 'Provisioning State' } - } - $AzSAInfo += [PSCustomObject]$InObj - } - if ($Healthcheck.StorageAccount.ProvisioningState) { - $AzSAInfo | Where-Object { $_.'Provisioning State' -ne 'Succeeded' } | Set-Style -Style Critical -Property 'Provisioning State' - } + if ($Healthcheck.StorageAccount.StorageAccountKeyAccess) { + $AzStorageAccountInfo | Where-Object { $_.'Storage Account Key Access' -eq 'Enabled' } | Set-Style -Style Warning -Property 'Storage Account Key Access' + } - if ($Healthcheck.StorageAccount.EnableHttpsTrafficOnly) { - $AzSAInfo | Where-Object { $_.'Enable Https Traffic Only' -ne 'Enabled' } | Set-Style -Style Warning -Property 'Enable Https Traffic Only' - } + if ($Healthcheck.StorageAccount.SecureTransfer) { + $AzStorageAccountInfo | Where-Object { $_.'Secure Transfer' -ne 'Enabled' } | Set-Style -Style Warning -Property 'Secure Transfer' + } - if ($Healthcheck.StorageAccount.PublicNetworkAccess) { - $AzSAInfo | Where-Object { $_.'Public Network Access' -eq 'Enabled' } | Set-Style -Style Warning -Property 'Public Network Access' - } + if ($Healthcheck.StorageAccount.PublicNetworkAccess) { + $AzStorageAccountInfo | Where-Object { $_.'Public Network Access' -eq 'Enabled' } | Set-Style -Style Warning -Property 'Public Network Access' + } - if ($Healthcheck.StorageAccount.MinimumTlsVersion) { - $AzSAInfo | Where-Object { $_.'Minimum TLS Version' -ne 'TLS1_2' } | Set-Style -Style Warning -Property 'Minimum TLS Version' - } + if ($Healthcheck.StorageAccount.MinimumTlsVersion) { + $AzStorageAccountInfo | Where-Object { $_.'Minimum TLS Version' -ne 'TLS1.2' } | Set-Style -Style Warning -Property 'Minimum TLS Version' + } - if ($InfoLevel.StorageAccount -ge 2) { - Paragraph "The following sections detail the configuration of the storage account within the $($AzSubscription.Name) subscription." - foreach ($AzStorageAccount in $AzSAInfo) { - Section -Style Heading5 "$($AzStorageAccount.Name)" { + if ($InfoLevel.StorageAccount -ge 2) { + Paragraph "The following sections detail the configuration of the storage account within the $($AzSubscription.Name) subscription." + foreach ($AzStorageAccount in $AzStorageAccountInfo) { + Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzStorageAccount.Name)" { + $TableParams = @{ + Name = "Storage Account - $($AzStorageAccount.Name)" + List = $true + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzStorageAccount | Table @TableParams + # Blob Service Properties + Get-AbrAzSABlobServiceProperty -ResourceGroupName $AzStorageAccount.'Resource Group' -StorageAccountName $AzStorageAccount.Name + # Container Service Properties + Get-AbrAzSAContainer -ResourceGroupName $AzStorageAccount.'Resource Group' -StorageAccountName $AzStorageAccount.Name + # File Service Properties + Get-AbrAzSAFileServiceProperty -ResourceGroupName $AzStorageAccount.'Resource Group' -StorageAccountName $AzStorageAccount.Name + # Share Service Properties + Get-AbrAzSAShare -ResourceGroupName $AzStorageAccount.'Resource Group' -StorageAccountName $AzStorageAccount.Name + } + } + } else { + Paragraph "The following table summarises the configuration of the storage account within the $($AzSubscription.Name) subscription." + BlankLine $TableParams = @{ - Name = "Storage Account - $($AzStorageAccount.Name)" - List = $true - ColumnWidths = 50, 50 + Name = "Storage Account - $($AzSubscription.Name)" + List = $false + Columns = 'Name', 'Resource Group', 'Location', 'Replication', 'Account Kind' + ColumnWidths = 20, 20, 20, 20, 20 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } - $AzStorageAccount | Table @TableParams - # Blob Service Properties - Get-AbrAzSABlobServiceProperty -ResourceGroupName $AzStorageAccount.'Resource Group' -StorageAccountName $AzStorageAccount.Name - Get-AbrAzSAFileServiceProperty -ResourceGroupName $AzStorageAccount.'Resource Group' -StorageAccountName $AzStorageAccount.Name - Get-AbrAzSAContainer -ResourceGroupName $AzStorageAccount.'Resource Group' -StorageAccountName $AzStorageAccount.Name - Get-AbrAzSAShare -ResourceGroupName $AzStorageAccount.'Resource Group' -StorageAccountName $AzStorageAccount.Name + $AzStorageAccountInfo | Table @TableParams } } - } else { - Paragraph "The following table summarises the configuration of the storage account within the $($AzSubscription.Name) subscription." - BlankLine - $TableParams = @{ - Name = "Storage Account - $($AzSubscription.Name)" - List = $false - Columns = 'Name', 'Resource Group', 'Location', 'Sku Name', 'Account Kind' - ColumnWidths = 20, 20, 20, 20, 20 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" - } - $AzSAInfo | Table @TableParams } } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzSubscription.ps1 b/Src/Private/Get-AbrAzSubscription.ps1 index c6aff80..30c2870 100644 --- a/Src/Private/Get-AbrAzSubscription.ps1 +++ b/Src/Private/Get-AbrAzSubscription.ps1 @@ -1,11 +1,11 @@ function Get-AbrAzSubscription { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Subscription information + Used by As Built Report to retrieve Azure Subscription information .DESCRIPTION .NOTES - Version: 0.1.1 + Version: 0.1.2 Author: Tim Carman Twitter: @tpcarman Github: tpcarman @@ -23,35 +23,39 @@ function Get-AbrAzSubscription { } process { - if ($AzSubscriptions) { - if ($Options.ShowSectionInfo) { - Paragraph "An Azure subscription is a logical container used to provision resources in Azure. It holds the details of all your resources like virtual machines (VMs), databases, and more. When you create an Azure resource like a VM, you must identify the subscription it belongs to." + Try { + if ($AzSubscriptions) { + if ($Options.ShowSectionInfo) { + Paragraph "An Azure subscription is a logical container used to provision resources in Azure. It holds the details of all your resources like virtual machines (VMs), databases, and more. When you create an Azure resource like a VM, you must identify the subscription it belongs to." + BlankLine + } + Paragraph "The following table summarises the subscription information within the $($AzTenant.Name) tenant." BlankLine - } - Paragraph "The following table summarises the subscription information within the $($AzTenant.Name) tenant." - BlankLine - $AzSubscriptionInfo = @() - foreach ($AzSubscription in $AzSubscriptions) { - $InObj = [Ordered]@{ - 'Name' = $AzSubscription.Name - 'Subscription ID' = $AzSubscription.SubscriptionId - 'State' = $AzSubscription.State + $AzSubscriptionInfo = @() + foreach ($AzSubscription in $AzSubscriptions) { + $InObj = [Ordered]@{ + 'Name' = $AzSubscription.Name + 'Subscription ID' = $AzSubscription.SubscriptionId + 'State' = $AzSubscription.State + } + $AzSubscriptionInfo += [pscustomobject]$InObj } - $AzSubscriptionInfo += [pscustomobject]$InObj - } - $TableParams = @{ - Name = "Subscriptions - $($AzTenant.Name)" - List = $false - ColumnWidths = 35, 50, 15 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" + $TableParams = @{ + Name = "Subscriptions - $($AzTenant.Name)" + List = $false + ColumnWidths = 35, 50, 15 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzSubscriptionInfo | Table @TableParams + } else { + Write-PScriboMessage -IsWarning 'No subscriptions found.' + Break } - $AzSubscriptionInfo | Table @TableParams - } else { - Write-PScriboMessage -IsWarning 'No subscriptions found.' - Break + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzTenant.ps1 b/Src/Private/Get-AbrAzTenant.ps1 index 44483e1..2c0077c 100644 --- a/Src/Private/Get-AbrAzTenant.ps1 +++ b/Src/Private/Get-AbrAzTenant.ps1 @@ -1,11 +1,11 @@ function Get-AbrAzTenant { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Tenant information + Used by As Built Report to retrieve Azure Tenant information .DESCRIPTION .NOTES - Version: 0.1.0 + Version: 0.1.1 Author: Tim Carman Twitter: @tpcarman Github: tpcarman @@ -23,21 +23,28 @@ function Get-AbrAzTenant { } process { - $AzTenantInfo = [PSCustomObject]@{ - 'Tenant Name' = $AzTenant.Name - 'Tenant ID' = $AzTenant.TenantId - 'Domains' = $AzTenant.Domains - } + Try { + $AzTenantInfo = [PSCustomObject]@{ + 'Tenant Name' = $AzTenant.Name + 'Tenant ID' = $AzTenant.TenantId + 'Tenant Type' = $AzTenant.TenantType + 'Country ' = (Get-CountryName $AzTenant.CountryCode) + 'Domains' = $AzTenant.Domains -join ', ' + 'Default Domain' = $AzTenant.DefaultDomain + } - $TableParams = @{ - Name = "Tenant - $($AzTenant.Name)" - List = $true - ColumnWidths = 50, 50 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" + $TableParams = @{ + Name = "Tenant - $($AzTenant.Name)" + List = $true + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzTenantInfo | Table @TableParams + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } - $AzTenantInfo | Table @TableParams } end {} diff --git a/Src/Private/Get-AbrAzVirtualMachine.ps1 b/Src/Private/Get-AbrAzVirtualMachine.ps1 index c63e0d1..f5ba9e2 100644 --- a/Src/Private/Get-AbrAzVirtualMachine.ps1 +++ b/Src/Private/Get-AbrAzVirtualMachine.ps1 @@ -1,11 +1,11 @@ function Get-AbrAzVirtualMachine { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Virtual Machine information from the Azure subscription + Used by As Built Report to retrieve Azure Virtual Machine information from the Azure subscription .DESCRIPTION .NOTES - Version: 0.1.0 + Version: 0.1.1 Author: Tim Carman Twitter: @tpcarman Github: tpcarman @@ -19,133 +19,150 @@ function Get-AbrAzVirtualMachine { ) begin { - Write-PScriboMessage "VM InfoLevel set at $($InfoLevel.VirtualMachine)." + Write-PScriboMessage "VirtualMachine InfoLevel set at $($InfoLevel.VirtualMachine)." } process { - $AzVMs = Get-AzVM -Status | Where-Object {$_.id.split('/')[2] -eq $AzSubscription.Id} | Sort-Object Name - if (($InfoLevel.VirtualMachine -gt 0) -and ($AzVMs)) { - Write-PscriboMessage "Collecting Azure VM information." - Section -Style Heading4 'Virtual Machines' { - if ($Options.ShowSectionInfo) { - Paragraph "Azure virtual machines are one of several types of on-demand, scalable computing resources that Azure offers. Typically, you choose a virtual machine when you need more control over the computing environment than the other choices offer. An Azure virtual machine gives you the flexibility of virtualization without having to buy and maintain the physical hardware that runs it. However, you still need to maintain the virtual machine by performing tasks, such as configuring, patching, and installing the software that runs on it." - BlankLine - } - $AzVMInfo = @() - foreach ($AzVM in $AzVMs) { - $AzVMSize = Get-AzVMSize -Location $AzVm.Location | Where-Object {$_.Name -eq $AzVm.HardwareProfile.VmSize} - $AzVmNic = Get-AzNetworkInterface | Where-Object {$_.VirtualMachine.Id -eq $AzVm.id} - $AzVmBackupStatus = Get-AzRecoveryServicesBackupStatus -Name $AzVm.Name -ResourceGroupName $AzVm.ResourceGroupName -Type "AzureVM" - $AzVmExtensions = Get-AzVMExtension -VMName $AzVm.Name -ResourceGroupName $AzVm.ResourceGroupName | Sort-Object Name - $AzVmDiskEncryption = Get-AzVMDiskEncryptionStatus -ResourceGroupName $AzVm.ResourceGroupName -VMName $AzVm.Name - $InObj = [Ordered]@{ - 'Name' = $AzVM.Name - 'Resource Group' = $AzVM.ResourceGroupName - 'Location' = $AzLocationLookup."$($AzVm.Location)" - 'Subscription' = "$($AzSubscriptionLookup.(($AzVm.Id).split('/')[2]))" - 'Status' = Switch ($AzVm.PowerState) { - 'Vm deallocated' { 'Deallocated'} - 'Vm running' { 'Running' } - default { $AzVm.PowerState } - } - 'Private IP Address' = $AzVmNic.IpConfigurations.PrivateIpAddress - 'Private IP Assignment' = $AzVmNic.IpConfigurations.PrivateIpAllocationMethod - 'Virtual Network / Subnet' = ($AzVmNic.IpConfigurations.Subnet.Id).split('/')[4] + " / " + ($AzVmNic.IpConfigurations.Subnet.Id).split('/')[-1] - 'OS Type' = $AzVm.StorageProfile.OsDisk.OsType - 'Size' = $AzVm.HardwareProfile.VmSize - 'vCPUs' = $AzVMSize.NumberOfCores - 'RAM' = "$($AzVMSize.MemoryInMB / 1024) GiB" - #'Operating System' = '' - 'OS Disk' = ($AzVm.StorageProfile.OsDisk.Name) - 'OS Disk Size' = Switch ($AzVm.StorageProfile.OsDisk.DiskSizeGB) { - $null { '--' } - default { "$($AzVm.StorageProfile.OsDisk.DiskSizeGB) GiB" } - } - 'OS Disk Type' = Switch ($AzVm.StorageProfile.OsDisk.ManagedDisk.StorageAccountType) { - $null { '--' } - 'Standard_LRS' { 'Standard LRS' } - 'Premium_LRS' { 'Premium LRS' } - 'Premium_ZRS' { 'Premium ZRS' } - 'StandardSSD_LRS' { 'Standard SSD LRS' } - 'StandardSSD_ZRS' { 'Standard SSD ZRS' } - 'UltraSSD_LRS' { 'Ultra SSD LRS' } + Try { + if ($InfoLevel.VirtualMachine -gt 0) { + $AzVMs = Get-AzVM -Status | Where-Object { $_.id.split('/')[2] -eq $AzSubscription.Id } | Sort-Object Name + if ($AzVMs) { + Write-PScriboMessage "Collecting Azure VM information." + Section -Style Heading4 'Virtual Machines' { + if ($Options.ShowSectionInfo) { + Paragraph "Azure virtual machines are one of several types of on-demand, scalable computing resources that Azure offers. Typically, you choose a virtual machine when you need more control over the computing environment than the other choices offer. An Azure virtual machine gives you the flexibility of virtualization without having to buy and maintain the physical hardware that runs it. However, you still need to maintain the virtual machine by performing tasks, such as configuring, patching, and installing the software that runs on it." + BlankLine } - 'No. of Data Disks' = ($AzVm.StorageProfile.DataDisks).Count - 'Azure Disk Encryption' = Switch ($AzVmDiskEncryption.OsVolumeEncryptionSettings.Enabled) { - $true { 'Enabled' } - $false { 'Not Enabled' } - $null { 'Not Enabled' } - } - 'Boot Diagnostics' = & { - if (($AzVM.DiagnosticsProfile.BootDiagnostics.Enabled) -and ($null -eq $AzVM.DiagnosticsProfile.BootDiagnostics.StorageUri)) { - "Enabled with managed storage account" - } elseif (($AzVM.DiagnosticsProfile.BootDiagnostics.Enabled) -and ($AzVM.DiagnosticsProfile.BootDiagnostics.StorageUri)) { - "Enabled with custom storage account" - } else { - "Disabled" + $AzVMInfo = @() + foreach ($AzVM in $AzVMs) { + $AzVMSize = Get-AzVMSize -Location $AzVm.Location | Where-Object { $_.Name -eq $AzVm.HardwareProfile.VmSize } + $AzVmNic = Get-AzNetworkInterface | Where-Object { $_.VirtualMachine.Id -eq $AzVm.id } + $AzVmBackupStatus = Get-AzRecoveryServicesBackupStatus -Name $AzVm.Name -ResourceGroupName $AzVm.ResourceGroupName -Type "AzureVM" -ErrorAction SilentlyContinue + $AzVmExtensions = Get-AzVMExtension -VMName $AzVm.Name -ResourceGroupName $AzVm.ResourceGroupName | Sort-Object Name + $AzVmDiskEncryption = Get-AzVMDiskEncryptionStatus -ResourceGroupName $AzVm.ResourceGroupName -VMName $AzVm.Name + $InObj = [Ordered]@{ + 'Name' = $AzVM.Name + 'Resource Group' = $AzVM.ResourceGroupName + 'Location' = $AzLocationLookup."$($AzVm.Location)" + 'Subscription' = "$($AzSubscriptionLookup.(($AzVm.Id).split('/')[2]))" + 'Status' = Switch ($AzVm.PowerState) { + 'Vm deallocated' { 'Deallocated' } + 'Vm running' { 'Running' } + default { $AzVm.PowerState } + } + 'Private IP Address' = $AzVmNic.IpConfigurations.PrivateIpAddress + 'Private IP Assignment' = $AzVmNic.IpConfigurations.PrivateIpAllocationMethod + 'Virtual Network / Subnet' = ($AzVmNic.IpConfigurations.Subnet.Id).split('/')[4] + " / " + ($AzVmNic.IpConfigurations.Subnet.Id).split('/')[-1] + 'OS Type' = $AzVm.StorageProfile.OsDisk.OsType + 'Size' = $AzVm.HardwareProfile.VmSize + 'vCPUs' = $AzVMSize.NumberOfCores + 'RAM' = "$($AzVMSize.MemoryInMB / 1024) GiB" + #'Operating System' = '' + 'OS Disk' = ($AzVm.StorageProfile.OsDisk.Name) + 'OS Disk Size' = if ($AzVm.StorageProfile.OsDisk.DiskSizeGB) { + "$($AzVm.StorageProfile.OsDisk.DiskSizeGB) GiB" + } else { + 'Unknown' + } + 'OS Disk Type' = Switch ($AzVm.StorageProfile.OsDisk.ManagedDisk.StorageAccountType) { + $null { '--' } + 'Standard_LRS' { 'Standard LRS' } + 'Premium_LRS' { 'Premium LRS' } + 'Premium_ZRS' { 'Premium ZRS' } + 'StandardSSD_LRS' { 'Standard SSD LRS' } + 'StandardSSD_ZRS' { 'Standard SSD ZRS' } + 'UltraSSD_LRS' { 'Ultra SSD LRS' } + } + 'No. of Data Disks' = ($AzVm.StorageProfile.DataDisks).Count + 'Azure Disk Encryption' = if ($AzVmDiskEncryption.OsVolumeEncryptionSettings.Enabled) { + 'Enabled' + } else { + 'Disabled' + } + 'Boot Diagnostics' = & { + if (($AzVM.DiagnosticsProfile.BootDiagnostics.Enabled) -and ($null -eq $AzVM.DiagnosticsProfile.BootDiagnostics.StorageUri)) { + 'Enabled with managed storage account' + } elseif (($AzVM.DiagnosticsProfile.BootDiagnostics.Enabled) -and ($AzVM.DiagnosticsProfile.BootDiagnostics.StorageUri)) { + 'Enabled with custom storage account' + } else { + 'Disabled' + } + } + 'Boot Diagnostics Storage Account' = if ($AzVM.DiagnosticsProfile.BootDiagnostics.StorageUri) { + $AzVM.DiagnosticsProfile.BootDiagnostics.StorageUri.split('.')[0].trimstart('https://') + } else { + 'None' + } + 'Azure Backup' = if ($AzVmBackupStatus.BackedUp) { + 'Enabled' + } else { + 'Disabled' + } + 'Extensions' = & { + if ($null -eq $AzVmExtensions.Name) { + 'None' + } else { $AzVmExtensions.Name -join ', ' } + } + } + + if ($Options.ShowTags) { + $InObj['Tags'] = if ([string]::IsNullOrEmpty($AzVm.Tags)) { + 'None' + } else { + ($AzVm.Tags.GetEnumerator() | ForEach-Object { "$($_.Key):`t$($_.Value)" }) -join [Environment]::NewLine + } } + + $AzVMInfo += [PSCustomObject]$InObj } - 'Boot Diagnostics Storage Account' = Switch ($AzVM.DiagnosticsProfile.BootDiagnostics.StorageUri) { - $null { '--' } - default { $AzVM.DiagnosticsProfile.BootDiagnostics.StorageUri.split('.')[0].trimstart('https://') } + + if ($Healthcheck.VirtualMachine.Status) { + $AzVMInfo | Where-Object { $_.'Status' -ne 'Running' } | Set-Style -Style Warning -Property 'Status' } - 'Azure Backup' = Switch ($AzVmBackupStatus.BackedUp) { - $true { 'Enabled' } - $false { 'Not Enabled' } - $null { 'Not Enabled' } + if ($Healthcheck.VirtualMachine.BootDiagnostics) { + $AzVMInfo | Where-Object { $_.'Boot Diagnostics' -ne 'Enabled with custom storage account' } | Set-Style -Style Warning -Property 'Boot Diagnostics' + $AzVMInfo | Where-Object { $_.'Boot Diagnostics' -eq 'Disabled' } | Set-Style -Style Critical -Property 'Boot Diagnostics' } - 'Extensions' = & { - if ($null -eq $AzVmExtensions.Name) { - '--' - } else { $AzVmExtensions.Name -join ', ' } + if ($Healthcheck.VirtualMachine.BackupEnabled) { + $AzVMInfo | Where-Object { $_.'Azure Backup' -ne 'Enabled' } | Set-Style -Style Warning -Property 'Azure Backup' } - } - $AzVMInfo += [PSCustomObject]$InObj - } - - if ($Healthcheck.VirtualMachine.Status) { - $AzVMInfo | Where-Object { $_.'Status' -ne 'Running' } | Set-Style -Style Warning -Property 'Status' - } - if ($Healthcheck.VirtualMachine.BootDiagnostics) { - $AzVMInfo | Where-Object { $_.'Boot Diagnostics' -ne 'Enabled with custom storage account' } | Set-Style -Style Warning -Property 'Boot Diagnostics' - $AzVMInfo | Where-Object { $_.'Boot Diagnostics' -eq 'Disabled' } | Set-Style -Style Critical -Property 'Boot Diagnostics' - } - if ($Healthcheck.VirtualMachine.BackupEnabled) { - $AzVMInfo | Where-Object { $_.'Azure Backup' -ne 'Enabled' } | Set-Style -Style Warning -Property 'Azure Backup' - } - if ($Healthcheck.VirtualMachine.DiskEncryption) { - $AzVMInfo | Where-Object { $_.'Azure Disk Encryption' -ne 'Enabled' } | Set-Style -Style Warning -Property 'Azure Disk Encryption' - } - if ($InfoLevel.VirtualMachine -ge 2) { - Paragraph "The following sections detail the configuration of the virtual machines within the $($AzSubscription.Name) subscription." - foreach ($AzVM in $AzVMInfo) { - Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzVM.Name)" { + if ($Healthcheck.VirtualMachine.DiskEncryption) { + $AzVMInfo | Where-Object { $_.'Azure Disk Encryption' -ne 'Enabled' } | Set-Style -Style Warning -Property 'Azure Disk Encryption' + } + if ($InfoLevel.VirtualMachine -ge 2) { + Paragraph "The following sections detail the configuration of the virtual machines within the $($AzSubscription.Name) subscription." + foreach ($AzVM in $AzVMInfo) { + Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzVM.Name)" { + $TableParams = @{ + Name = "Virtual Machine - $($AzVM.Name)" + List = $true + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzVM | Table @TableParams + } + } + } else { + Paragraph "The following table summarises the configuration of the virtual machines within the $($AzSubscription.Name) subscription." + BlankLine $TableParams = @{ - Name = "Virtual Machine - $($AzVM.Name)" - List = $true - ColumnWidths = 50, 50 + Name = "Virtual Machines - $($AzSubscription.Name)" + List = $false + Columns = 'Name', 'Resource Group', 'Location', 'Status', 'Private IP Address', 'OS Type' + ColumnWidths = 21, 23, 15, 13, 15, 13 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } - $AzVM | Table @TableParams + $AzVMInfo | Table @TableParams } } - } else { - Paragraph "The following table summarises the configuration of the virtual machines within the $($AzSubscription.Name) subscription." - BlankLine - $TableParams = @{ - Name = "Virtual Machines - $($AzSubscription.Name)" - List = $false - Columns = 'Name', 'Resource Group', 'Location', 'Status', 'Private IP Address', 'OS Type' - ColumnWidths = 21, 23, 15, 13, 15, 13 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" - } - $AzVMInfo | Table @TableParams } } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzVirtualNetwork.ps1 b/Src/Private/Get-AbrAzVirtualNetwork.ps1 index 7ec009d..ecdef30 100644 --- a/Src/Private/Get-AbrAzVirtualNetwork.ps1 +++ b/Src/Private/Get-AbrAzVirtualNetwork.ps1 @@ -1,11 +1,11 @@ function Get-AbrAzVirtualNetwork { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Virtual Network information + Used by As Built Report to retrieve Azure Virtual Network information .DESCRIPTION .NOTES - Version: 0.1.1 + Version: 0.1.2 Author: Tim Carman Twitter: @tpcarman Github: tpcarman @@ -23,83 +23,94 @@ function Get-AbrAzVirtualNetwork { } process { - $AzVirtualNetworks = Get-AzVirtualNetwork | Sort-Object Name - if (($InfoLevel.VirtualNetwork -gt 0) -and ($AzVirtualNetworks)) { - Write-PscriboMessage "Collecting Azure Virtual Network information." - Section -Style Heading4 'Virtual Networks' { - if ($Options.ShowSectionInfo) { - Paragraph "Azure Virtual Network (VNet) is the fundamental building block for a private network in Azure. VNet enables many types of Azure resources, such as Azure Virtual Machines (VM), to securely communicate with each other, the internet, and on-premises networks. VNet is similar to a traditional network that would operate in a traditonal data center, but brings with it additional benefits of Azure's infrastructure such as scale, availability, and isolation." - BlankLine - if ($InfoLevel.VirtualNetwork -ge 2) { - Paragraph -Bold "Peerings" - Paragraph "Virtual network peering enables you to seamlessly connect two or more Virtual Networks in Azure. The virtual networks appear as one for connectivity purposes. The traffic between virtual machines in peered virtual networks uses the Microsoft backbone infrastructure. Like traffic between virtual machines in the same network, traffic is routed through Microsoft's private network only." - BlankLine - Paragraph -Bold "Subnets" - Paragraph "Subnets enable you to segment the virtual network into one or more sub-networks and allocate a portion of the virtual network's address space to each subnet. You can then deploy Azure resources in a specific subnet. Just like in a traditional network, subnets allow you to segment your VNet address space into segments that are appropriate for the organization's internal network. This also improves address allocation efficiency. You can secure resources within subnets using Network Security Groups." - BlankLine - } - } - $AzVirtualNetworkInfo = @() - foreach ($AzVirtualNetwork in $AzVirtualNetworks) { - $InObj = [Ordered]@{ - 'Name' = $AzVirtualNetwork.Name - 'Resource Group' = $AzVirtualNetwork.ResourceGroupName - 'Location' = $AzLocationLookup."$($AzVirtualNetwork.Location)" - 'Subscription' = "$($AzSubscriptionLookup.(($AzVirtualNetwork.Id).split('/')[2]))" - 'Provisioning State' = $AzVirtualNetwork.ProvisioningState - 'Address Space' = & { - if ($AzVirtualNetwork.AddressSpace.AddressPrefixes) { - $AzVirtualNetwork.AddressSpace.AddressPrefixes -join ', ' - } else { - 'None' + Try { + if ($InfoLevel.VirtualNetwork -gt 0) { + $AzVirtualNetworks = Get-AzVirtualNetwork | Sort-Object Name + if ($AzVirtualNetworks) { + Write-PscriboMessage "Collecting Azure Virtual Network information." + Section -Style Heading4 'Virtual Networks' { + if ($Options.ShowSectionInfo) { + Paragraph "Azure Virtual Network (VNet) is the fundamental building block for a private network in Azure. VNet enables many types of Azure resources, such as Azure Virtual Machines (VM), to securely communicate with each other, the internet, and on-premises networks. VNet is similar to a traditional network that would operate in a traditonal data center, but brings with it additional benefits of Azure's infrastructure such as scale, availability, and isolation." + BlankLine + if ($InfoLevel.VirtualNetwork -ge 2) { + Paragraph -Bold "Peerings" + Paragraph "Virtual network peering enables you to seamlessly connect two or more Virtual Networks in Azure. The virtual networks appear as one for connectivity purposes. The traffic between virtual machines in peered virtual networks uses the Microsoft backbone infrastructure. Like traffic between virtual machines in the same network, traffic is routed through Microsoft's private network only." + BlankLine + Paragraph -Bold "Subnets" + Paragraph "Subnets enable you to segment the virtual network into one or more sub-networks and allocate a portion of the virtual network's address space to each subnet. You can then deploy Azure resources in a specific subnet. Just like in a traditional network, subnets allow you to segment your VNet address space into segments that are appropriate for the organization's internal network. This also improves address allocation efficiency. You can secure resources within subnets using Network Security Groups." + BlankLine } } - 'DNS Servers' = & { - if ($AzVirtualNetwork.DhcpOptions.DnsServers) { - $AzVirtualNetwork.DhcpOptions.DnsServers -join ', ' - } else { - 'None' + $AzVirtualNetworkInfo = @() + foreach ($AzVirtualNetwork in $AzVirtualNetworks) { + $InObj = [Ordered]@{ + 'Name' = $AzVirtualNetwork.Name + 'Resource Group' = $AzVirtualNetwork.ResourceGroupName + 'Location' = $AzLocationLookup."$($AzVirtualNetwork.Location)" + 'Subscription' = "$($AzSubscriptionLookup.(($AzVirtualNetwork.Id).split('/')[2]))" + 'Provisioning State' = $AzVirtualNetwork.ProvisioningState + 'Address Space' = if ($AzVirtualNetwork.AddressSpace.AddressPrefixes) { + $AzVirtualNetwork.AddressSpace.AddressPrefixes -join ', ' + } else { + 'Unknown' + } + 'DNS Servers' = if ($AzVirtualNetwork.DhcpOptions.DnsServers) { + $AzVirtualNetwork.DhcpOptions.DnsServers -join ', ' + } else { + 'Default (Azure-provided)' + } + } + + if ($Options.ShowTags) { + $InObj['Tags'] = if ([string]::IsNullOrEmpty($AzVirtualNetwork.Tag)) { + 'None' + } else { + ($AzVirtualNetwork.Tag.GetEnumerator() | ForEach-Object { "$($_.Name):`t$($_.Value)" }) -join [Environment]::NewLine + } } + + $AzVirtualNetworkInfo += [PSCustomObject]$InObj } - } - $AzVirtualNetworkInfo += [PSCustomObject]$InObj - } - if ($InfoLevel.VirtualNetwork -ge 2) { - Paragraph "The following sections detail the configuration of the virtual networks within the $($AzSubscription.Name) subscription." - foreach ($AzVirtualNetwork in $AzVirtualNetworkInfo) { - Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzVirtualNetwork.Name)" { + if ($InfoLevel.VirtualNetwork -ge 2) { + Paragraph "The following sections detail the configuration of the virtual networks within the $($AzSubscription.Name) subscription." + foreach ($AzVirtualNetwork in $AzVirtualNetworkInfo) { + Section -Style NOTOCHeading5 -ExcludeFromTOC "$($AzVirtualNetwork.Name)" { + $TableParams = @{ + Name = "Virtual Network - $($AzVirtualNetwork.Name)" + List = $true + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzVirtualNetwork | Table @TableParams + + # Virtual Network Peering + Get-AbrAzVirtualNetworkPeering -Name $AzVirtualNetwork.Name + # Virtual Network Subnets + Get-AbrAzVirtualNetworkSubnet -Name $AzVirtualNetwork.Name + } + } + } else { + Paragraph "The following table summarises the configuration of the virtual networks within the $($AzSubscription.Name) subscription." + BlankLine $TableParams = @{ - Name = "Virtual Network - $($AzVirtualNetwork.Name)" - List = $true - ColumnWidths = 50, 50 + Name = "Virtual Networks - $($AzSubscription.Name)" + List = $false + Columns = 'Name', 'Resource Group', 'Location', 'Address Space' + ColumnWidths = 25, 25, 25, 25 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } - $AzVirtualNetwork | Table @TableParams - - # Virtual Network Peering - Get-AbrAzVirtualNetworkPeering -Name $AzVirtualNetwork.Name - # Virtual Network Subnets - Get-AbrAzVirtualNetworkSubnet -Name $AzVirtualNetwork.Name + $AzVirtualNetworkInfo | Table @TableParams } } - } else { - Paragraph "The following table summarises the configuration of the virtual networks within the $($AzSubscription.Name) subscription." - BlankLine - $TableParams = @{ - Name = "Virtual Networks - $($AzSubscription.Name)" - List = $false - Columns = 'Name', 'Resource Group', 'Location', 'Address Space' - ColumnWidths = 25, 25, 25, 25 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" - } - $AzVirtualNetworkInfo | Table @TableParams } } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AbrAzVirtualNetworkPeering.ps1 b/Src/Private/Get-AbrAzVirtualNetworkPeering.ps1 index ca7bb90..983a174 100644 --- a/Src/Private/Get-AbrAzVirtualNetworkPeering.ps1 +++ b/Src/Private/Get-AbrAzVirtualNetworkPeering.ps1 @@ -1,11 +1,11 @@ function Get-AbrAzVirtualNetworkPeering { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Virtual Network Peering information + Used by As Built Report to retrieve Azure Virtual Network Peering information .DESCRIPTION .NOTES - Version: 0.1.1 + Version: 0.1.2 Author: Tim Carman Twitter: @tpcarman Github: tpcarman @@ -27,53 +27,58 @@ function Get-AbrAzVirtualNetworkPeering { begin {} process { - $AzVirtualNetworkPeerings = (Get-AzVirtualNetwork -Name $Name).VirtualNetworkPeerings | Sort-Object Name - if ($AzVirtualNetworkPeerings) { - Write-PscriboMessage "Collecting Azure Virtual Network Peering information." - Section -Style NOTOCHeading6 -ExcludeFromTOC 'Peerings' { - foreach ($AzVirtualNetworkPeering in $AzVirtualNetworkPeerings) { - Section -Style NOTOCHeading7 -ExcludeFromTOC $($AzVirtualNetworkPeering.Name) { - $AzVirtualNetworkPeeringInfo = [PSCustomObject]@{ - 'Name' = $AzVirtualNetworkPeering.Name - 'Peering Status' = $AzVirtualNetworkPeering.PeeringSyncLevel - 'Peering State' = $AzVirtualNetworkPeering.PeeringState - 'Peer' = ($AzVirtualNetworkPeering.RemoteVirtualNetwork.Id).split('/')[-1] - 'Address Space' = $AzVirtualNetworkPeering.RemoteVirtualNetworkAddressSpace.AddressPrefixes -join ', ' - 'Gateway Transit' = Switch ($AzVirtualNetworkPeering.AllowGatewayTransit) { - $true { 'Enabled' } - $false { 'Disabled' } - } - 'Traffic to Remote VNet' = Switch ($AzVirtualNetworkPeering.AllowVirtualNetworkAccess) { - $true { 'Allow' } - $false { 'Block all traffic to the remote virtual network' } - } - 'Traffic forwarded from Remote VNet' = Switch ($AzVirtualNetworkPeering.AllowForwardedTraffic) { - $true { 'Allow' } - $false { 'Block traffic that originates from outside this network' } - } - 'VNet Gateway or Route Server' = & { - if ($AzVirtualNetworkPeering.UseRemoteGateways) { + Try { + $AzVirtualNetworkPeerings = (Get-AzVirtualNetwork -Name $Name).VirtualNetworkPeerings | Sort-Object Name + if ($AzVirtualNetworkPeerings) { + Write-PscriboMessage "Collecting Azure Virtual Network Peering information." + Section -Style NOTOCHeading6 -ExcludeFromTOC 'Peerings' { + foreach ($AzVirtualNetworkPeering in $AzVirtualNetworkPeerings) { + Section -Style NOTOCHeading7 -ExcludeFromTOC $($AzVirtualNetworkPeering.Name) { + $AzVirtualNetworkPeeringInfo = [PSCustomObject]@{ + 'Name' = $AzVirtualNetworkPeering.Name + 'Peering Status' = $AzVirtualNetworkPeering.PeeringSyncLevel + 'Peering State' = $AzVirtualNetworkPeering.PeeringState + 'Peer' = ($AzVirtualNetworkPeering.RemoteVirtualNetwork.Id).split('/')[-1] + 'Address Space' = $AzVirtualNetworkPeering.RemoteVirtualNetworkAddressSpace.AddressPrefixes -join ', ' + 'Gateway Transit' = if ($AzVirtualNetworkPeering.AllowGatewayTransit) { + 'Enabled' + } else { + 'Disabled' + } + 'Traffic to Remote VNet' = if ($AzVirtualNetworkPeering.AllowVirtualNetworkAccess) { + 'Allow' + } else { + 'Block all traffic to the remote virtual network' + } + 'Traffic forwarded from Remote VNet' = if ($AzVirtualNetworkPeering.AllowForwardedTraffic) { + 'Allow' + } else { + 'Block traffic that originates from outside this network' + } + 'VNet Gateway or Route Server' = if ($AzVirtualNetworkPeering.UseRemoteGateways) { "Use the remote virtual network's gateway or Route Server" } elseif ($AzVirtualNetworkPeering.UseRemoteGateways -eq $false) { "Use this virtual network's gateway or Route Server" } elseif (($AzVirtualNetworkPeering.UseRemoteGateways -eq $false) -and ($null -eq $AzVirtualNetworkPeering.RemoteGateways)) { 'None' } - } + } + $TableParams = @{ + Name = "Peering - $($AzVirtualNetworkPeering.Name)" + List = $true + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzVirtualNetworkPeeringInfo | Table @TableParams } - $TableParams = @{ - Name = "Peering - $($AzVirtualNetworkPeering.Name)" - List = $true - ColumnWidths = 50, 50 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" - } - $AzVirtualNetworkPeeringInfo | Table @TableParams } } } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-AzVirtualNetworkSubnet.ps1 b/Src/Private/Get-AzVirtualNetworkSubnet.ps1 index 1f8df8d..0992af9 100644 --- a/Src/Private/Get-AzVirtualNetworkSubnet.ps1 +++ b/Src/Private/Get-AzVirtualNetworkSubnet.ps1 @@ -1,11 +1,11 @@ function Get-AbrAzVirtualNetworkSubnet { <# .SYNOPSIS - Used by As Built Report to retrieve Azure Virtual Network Subnet information + Used by As Built Report to retrieve Azure Virtual Network Subnet information .DESCRIPTION .NOTES - Version: 0.1.0 + Version: 0.1.1 Author: Tim Carman Twitter: @tpcarman Github: tpcarman @@ -27,25 +27,27 @@ function Get-AbrAzVirtualNetworkSubnet { begin {} process { - $AzVirtualNetworkSubnets = (Get-AzVirtualNetwork -Name $Name).Subnets | Sort-Object Name - if ($AzVirtualNetworkSubnets) { - Write-PscriboMessage "Collecting Azure Virtual Network Subnet information." - Section -Style NOTOCHeading6 -ExcludeFromTOC 'Subnets' { - foreach ($AzVirtualNetworkSubnet in $AzVirtualNetworkSubnets) { - Section -Style NOTOCHeading7 -ExcludeFromTOC $($AzVirtualNetworkSubnet.Name) { - $AzVirtualNetworkSubnetInfo = [PSCustomObject]@{ - 'Name' = $AzVirtualNetworkSubnet.Name - 'Address Range' = $AzVirtualNetworkSubnet.AddressPrefix - 'NAT Gateway' = Switch ($AzVirtualNetworkSubnet.NatGateway) { - $null { 'None' } - default { $AzVirtualNetworkSubnet.NatGateway } - } - 'Network Security Group' = Switch ($AzVirtualNetworkSubnet.NetworkSecurityGroup.Id) { - $null { 'None' } - default { ($AzVirtualNetworkSubnet.NetworkSecurityGroup.Id).Split('/')[-1] } - } - 'Route Table' = & { - if ($AzVirtualNetworkSubnet.Name -eq 'AzureBastionSubnet') { + Try { + $AzVirtualNetworkSubnets = (Get-AzVirtualNetwork -Name $Name).Subnets | Sort-Object Name + if ($AzVirtualNetworkSubnets) { + Write-PscriboMessage "Collecting Azure Virtual Network Subnet information." + Section -Style NOTOCHeading6 -ExcludeFromTOC 'Subnets' { + foreach ($AzVirtualNetworkSubnet in $AzVirtualNetworkSubnets) { + Section -Style NOTOCHeading7 -ExcludeFromTOC $($AzVirtualNetworkSubnet.Name) { + $AzVirtualNetworkSubnetInfo = [PSCustomObject]@{ + 'Name' = $AzVirtualNetworkSubnet.Name + 'Address Range' = $AzVirtualNetworkSubnet.AddressPrefix + 'NAT Gateway' = if ($AzVirtualNetworkSubnet.NatGateway) { + $AzVirtualNetworkSubnet.NatGateway + } else { + 'None' + } + 'Network Security Group' = if ($AzVirtualNetworkSubnet.NetworkSecurityGroup.Id) { + ($AzVirtualNetworkSubnet.NetworkSecurityGroup.Id).Split('/')[-1] + } else { + 'None' + } + 'Route Table' = if ($AzVirtualNetworkSubnet.Name -eq 'AzureBastionSubnet') { 'None' } elseif ($AzVirtualNetworkSubnet.RouteTable.Id) { ($AzVirtualNetworkSubnet.RouteTable.Id).Split('/')[-1] @@ -53,20 +55,22 @@ function Get-AbrAzVirtualNetworkSubnet { 'None' } } - } - $TableParams = @{ - Name = "Subnet - $($AzVirtualNetworkSubnet.Name)" - List = $true - ColumnWidths = 50, 50 - } - if ($Report.ShowTableCaptions) { - $TableParams['Caption'] = "- $($TableParams.Name)" + $TableParams = @{ + Name = "Subnet - $($AzVirtualNetworkSubnet.Name)" + List = $true + ColumnWidths = 40, 60 + } + if ($Report.ShowTableCaptions) { + $TableParams['Caption'] = "- $($TableParams.Name)" + } + $AzVirtualNetworkSubnetInfo | Table @TableParams } - $AzVirtualNetworkSubnetInfo | Table @TableParams } } } + } Catch { + Write-PScriboMessage -IsWarning $($_.Exception.Message) } } diff --git a/Src/Private/Get-CountryName.ps1 b/Src/Private/Get-CountryName.ps1 new file mode 100644 index 0000000..0ebb4e9 --- /dev/null +++ b/Src/Private/Get-CountryName.ps1 @@ -0,0 +1,266 @@ +function Get-CountryName { + param ( + [Parameter(Mandatory = $true)] + [string]$CountryCode + ) + + # Define a hashtable of country codes and names + $CountryLookup = @{ + AF = 'Afghanistan' + AX = 'Åland Islands' + AL = 'Albania' + DZ = 'Algeria' + AS = 'American Samoa' + AD = 'Andorra' + AO = 'Angola' + AQ = 'Antarctica' + AG = 'Antigua and Barbuda' + AR = 'Argentina' + AM = 'Armenia' + AW = 'Aruba' + AU = 'Australia' + AT = 'Austria' + AZ = 'Azerbaijan' + BS = 'Bahamas' + BH = 'Bahrain' + BD = 'Bangladesh' + BB = 'Barbados' + BY = 'Belarus' + BE = 'Belgium' + BZ = 'Belize' + BJ = 'Benin' + BM = 'Bermuda' + BT = 'Bhutan' + BO = 'Bolivia' + BQ = 'Bonaire' + BA = 'Bosnia and Herzegovina' + BW = 'Botswana' + BV = 'Bouvet Island' + BR = 'Brazil' + IO = 'British Indian Ocean Territory' + VG = 'British Virgin Islands' + BN = 'Brunei' + BG = 'Bulgaria' + BF = 'Burkina Faso' + BI = 'Burundi' + CV = 'Cabo Verde' + KH = 'Cambodia' + CM = 'Cameroon' + CA = 'Canada' + KY = 'Cayman Islands' + CF = 'Central African Republic' + TD = 'Chad' + CZ = 'Czechia' + CL = 'Chile' + CN = 'China' + CX = 'Christmas Island' + CC = 'Cocos (Keeling) Islands' + CO = 'Colombia' + KM = 'Comoros' + CG = 'Congo' + CD = 'Congo (DRC)' + CK = 'Cook Islands' + CR = 'Costa Rica' + CI = 'Côte d''Ivoire' + HR = 'Croatia' + CU = 'Cuba' + CW = 'Curaçao' + CY = 'Cyprus' + DK = 'Denmark' + DJ = 'Djibouti' + DM = 'Dominica' + DO = 'Dominican Republic' + EC = 'Ecuador' + EG = 'Egypt' + SV = 'El Salvador' + GQ = 'Equatorial Guinea' + ER = 'Eritrea' + EE = 'Estonia' + SZ = 'eSwatini' + ET = 'Ethiopia' + FO = 'Faroe Islands' + FJ = 'Fiji' + FI = 'Finland' + FR = 'France' + GF = 'French Guiana' + PF = 'French Polynesia' + TF = 'French Southern Territories' + GA = 'Gabon' + GM = 'Gambia' + GE = 'Georgia' + DE = 'Germany' + GH = 'Ghana' + GI = 'Gibraltar' + GR = 'Greece' + GL = 'Greenland' + GD = 'Grenada' + GP = 'Guadeloupe' + GU = 'Guam' + GT = 'Guatemala' + GG = 'Guernsey' + GN = 'Guinea' + GW = 'Guinea-Bissau' + GY = 'Guyana' + HT = 'Haiti' + HM = 'Heard Island and McDonald Islands' + HN = 'Honduras' + HK = 'Hong Kong SAR' + HU = 'Hungary' + IS = 'Iceland' + IN = 'India' + ID = 'Indonesia' + IR = 'Iran' + IQ = 'Iraq' + IE = 'Ireland' + IM = 'Isle of Man' + IL = 'Israel' + IT = 'Italy' + JM = 'Jamaica' + JP = 'Japan' + JE = 'Jersey' + JO = 'Jordan' + KZ = 'Kazakhstan' + KE = 'Kenya' + KI = 'Kiribati' + KR = 'Korea (South)' + KW = 'Kuwait' + KG = 'Kyrgyzstan' + LA = 'Laos' + LV = 'Latvia' + LB = 'Lebanon' + LS = 'Lesotho' + LR = 'Liberia' + LY = 'Libya' + LI = 'Liechtenstein' + LT = 'Lithuania' + LU = 'Luxembourg' + MO = 'Macao SAR' + MG = 'Madagascar' + MW = 'Malawi' + MY = 'Malaysia' + MV = 'Maldives' + ML = 'Mali' + MT = 'Malta' + MH = 'Marshall Islands' + MQ = 'Martinique' + MR = 'Mauritania' + MU = 'Mauritius' + YT = 'Mayotte' + MX = 'Mexico' + FM = 'Micronesia' + MD = 'Moldova' + MC = 'Monaco' + MN = 'Mongolia' + ME = 'Montenegro' + MS = 'Montserrat' + MA = 'Morocco' + MZ = 'Mozambique' + MM = 'Myanmar' + NA = 'Namibia' + NR = 'Nauru' + NP = 'Nepal' + NL = 'Netherlands' + NC = 'New Caledonia' + NZ = 'New Zealand' + NI = 'Nicaragua' + NE = 'Niger' + NG = 'Nigeria' + NU = 'Niue' + NF = 'Norfolk Island' + KP = 'North Korea' + MP = 'Northern Mariana Islands' + MK = 'North Macedonia' + NO = 'Norway' + OM = 'Oman' + PK = 'Pakistan' + PW = 'Palau' + PS = 'Palestinian Authority' + PA = 'Panama' + PG = 'Papua New Guinea' + PY = 'Paraguay' + PE = 'Peru' + PH = 'Philippines' + PN = 'Pitcairn Islands' + PL = 'Poland' + PT = 'Portugal' + PR = 'Puerto Rico' + QA = 'Qatar' + RE = 'Réunion' + RO = 'Romania' + RU = 'Russia' + RW = 'Rwanda' + BL = 'Saint Barthélemy' + KN = 'Saint Kitts and Nevis' + LC = 'Saint Lucia' + MF = 'Saint Martin' + PM = 'Saint Pierre and Miquelon' + VC = 'Saint Vincent and the Grenadines' + WS = 'Samoa' + SM = 'San Marino' + ST = 'São Tomé and Príncipe' + SA = 'Saudi Arabia' + SN = 'Senegal' + RS = 'Serbia' + SC = 'Seychelles' + SL = 'Sierra Leone' + SG = 'Singapore' + SX = 'Sint Maarten' + SK = 'Slovakia' + SI = 'Slovenia' + SB = 'Solomon Islands' + SO = 'Somalia' + ZA = 'South Africa' + GS = 'South Georgia and South Sandwich Islands' + SS = 'South Sudan' + ES = 'Spain' + LK = 'Sri Lanka' + SH = 'St Helena, Ascension, Tristan da Cunha' + SD = 'Sudan' + SR = 'Suriname' + SJ = 'Svalbard' + SE = 'Sweden' + CH = 'Switzerland' + SY = 'Syria' + TW = 'Taiwan' + TJ = 'Tajikistan' + TZ = 'Tanzania' + TH = 'Thailand' + TL = 'Timor-Leste' + TG = 'Togo' + TK = 'Tokelau' + TO = 'Tonga' + TT = 'Trinidad and Tobago' + TN = 'Tunisia' + TR = 'Türkiye' + TM = 'Turkmenistan' + TC = 'Turks and Caicos Islands' + TV = 'Tuvalu' + UG = 'Uganda' + UA = 'Ukraine' + AE = 'United Arab Emirates' + GB = 'United Kingdom' + US = 'United States' + UY = 'Uruguay' + UM = 'U.S. Outlying Islands' + VI = 'U.S. Virgin Islands' + UZ = 'Uzbekistan' + VU = 'Vanuatu' + VA = 'Vatican City' + VE = 'Venezuela' + VN = 'Vietnam' + WF = 'Wallis and Futuna' + YE = 'Yemen' + ZM = 'Zambia' + ZW = 'Zimbabwe' + } + + # Convert input to uppercase to handle case insensitivity + $CountryCode = $CountryCode.ToUpper() + + # Lookup the country name or return a default message if not found + if ($CountryLookup.ContainsKey($CountryCode)) { + return $CountryLookup[$CountryCode] + } else { + return "Country code not found" + } +} \ No newline at end of file diff --git a/Src/Public/Invoke-AsBuiltReport.Microsoft.Azure.ps1 b/Src/Public/Invoke-AsBuiltReport.Microsoft.Azure.ps1 index ab5d8fc..c87a89c 100644 --- a/Src/Public/Invoke-AsBuiltReport.Microsoft.Azure.ps1 +++ b/Src/Public/Invoke-AsBuiltReport.Microsoft.Azure.ps1 @@ -5,7 +5,7 @@ function Invoke-AsBuiltReport.Microsoft.Azure { .DESCRIPTION Documents the configuration of Microsoft Azure in Word/HTML/Text formats using PScribo. .NOTES - Version: 0.1.5 + Version: 0.1.7 Author: Tim Carman Twitter: @tpcarman Github: @tpcarman @@ -22,7 +22,7 @@ function Invoke-AsBuiltReport.Microsoft.Azure { [Switch] $MFA ) - Get-RequiredModule -Name 'Az' -Version '9.4.0' + Get-RequiredModule -Name 'Az' -Version '12.0.0' Write-PScriboMessage -Plugin "Module" -Message "Please refer to the AsBuiltReport.Microsoft.Azure GitHub website for more detailed information about this project." Write-PScriboMessage -Plugin "Module" -Message "Do not forget to update your report configuration file after each new version release: https://www.asbuiltreport.com/user-guide/new-asbuiltreportconfig/" @@ -66,31 +66,33 @@ function Invoke-AsBuiltReport.Microsoft.Azure { if ($AzAccount) { $AzTenant = Get-AzTenant -TenantId $TenantId $AzLocations = Get-AzLocation - $AzLocationLookup = @{ } + $AzLocationLookup = @{} foreach ($AzLocation in $AzLocations) { $AzLocationLookup.($AzLocation.Location) = $AzLocation.DisplayName } if ($AzTenant) { - if ($Filter.Subscription -eq "*") { - $AzSubscriptions = Get-AzSubscription -TenantId $TenantId | Sort-Object Name - } else { + # Create a Lookup Hashtable for all Azure Subscriptions + $AzSubscriptions = Get-AzSubscription -TenantId $TenantId | Sort-Object Name + $AzSubscriptionLookup = @{} + foreach ($AzSubscription in $AzSubscriptions) { + $AzSubscriptionLookup.($AzSubscription.SubscriptionId) = $AzSubscription.Name + } + + # Filter Subscriptions + if ($Filter.Subscription -ne "*") { $AzSubscriptions = foreach ($AzSubscription in $Filter.Subscription) { - Get-AzSubscription -TenantId $TenantId -SubscriptionId $AzSubscription + Get-AzSubscription -TenantId $TenantId -SubscriptionId $AzSubscription | Sort-Object Name } } - $AzSubscriptionLookup = @{ } - foreach ($AzSubscription in ($AzSubscriptions | Sort-Object Name)) { - $AzSubscriptionLookup.($AzSubscription.SubscriptionId) = $AzSubscription.Name - } + Section -Style Heading1 $($AzTenant.Name) { Get-AbrAzTenant Section -Style Heading2 'Subscriptions' { Get-AbrAzSubscription - foreach ($AzSubscription in ($AzSubscriptions | Sort-Object Name)) { + foreach ($AzSubscription in $AzSubscriptions) { Section -Style Heading3 $($AzSubscription.Name) { Write-PScriboMessage "Setting Azure context to Subscription ID '$AzSubscription.Id'." $AzContext = Set-AzContext -Subscription $AzSubscription.Id -Tenant $TenantId - Get-AbrAzPolicyAssignment Get-AbrAzAvailabilitySet Get-AbrAzBastion Get-AbrAzExpressRouteCircuit @@ -100,6 +102,7 @@ function Invoke-AsBuiltReport.Microsoft.Azure { Get-AbrAzLoadBalancer Get-AbrAzVirtualNetwork Get-AbrAzNetworkSecurityGroup + Get-AbrAzPolicy Get-AbrAzRouteTable Get-AbrAzVirtualMachine Get-AbrAzRecoveryServicesVault