AzureScout

2.5.3

AzureScout — discover, inventory, and assess everything in your Azure environment from one command. Run Invoke-AzureScout with no parameters for a guided wizard, or drive it with switches: by default it inventories Azure resources, Entra ID, and identity objects (Excel, JSON, Markdown, AsciiDoc); add -Assessment and it runs a read-only CAF/WAF landing-zone assessment,
AzureScout — discover, inventory, and assess everything in your Azure environment from one command. Run Invoke-AzureScout with no parameters for a guided wizard, or drive it with switches: by default it inventories Azure resources, Entra ID, and identity objects (Excel, JSON, Markdown, AsciiDoc); add -Assessment and it runs a read-only CAF/WAF landing-zone assessment, scoring the tenant against Cloud Adoption Framework design areas and Well-Architected pillars and producing Power BI, self-contained HTML, executive PowerPoint, and JSON/Excel evidence. See everything. Own your cloud. (Requires PowerShell 7 on PowerShell Core.)
Show more

Minimum PowerShell version

7.0

Installation Options

Copy and Paste the following command to install this package using PowerShellGet More Info

Install-Module -Name AzureScout -RequiredVersion 2.5.3

Copy and Paste the following command to install this package using Microsoft.PowerShell.PSResourceGet More Info

Install-PSResource -Name AzureScout -Version 2.5.3

You can deploy this package directly to Azure Automation. Note that deploying packages with dependencies will deploy all the dependencies to Azure Automation. Learn More

Manually download the .nupkg file to your system's default download location. Note that the file won't be unpacked, and won't include any dependencies. Learn More

Owners

Copyright

(c) 2026 Hybrid Cloud Solutions. All rights reserved.

Package Details

Author(s)

  • Kristopher Turner

Tags

Azure AzureScout Discovery Inventory Assessment CAF WAF WellArchitected CloudAdoptionFramework LandingZone Governance AZSC EntraID Resources ARM Graph Reporting Excel PowerBI

Functions

Start-AZSCAdvisoryJob Start-AZSCPolicyJob Start-AZSCSecCenterJob Start-AZSCSubscriptionJob Wait-AZSCJob Build-AZSCDiagramSubnet Set-AZSCDiagramFile Start-AZSCDiagramJob Start-AZSCDiagramNetwork Start-AZSCDiagramOrganization Start-AZSCDiagramSubscription Start-AZSCDrawIODiagram Invoke-AzureScout Test-AZSCPermissions Start-AZSCWizard Invoke-ScoutAssessment Test-ScoutPermission Invoke-ScoutPipeline Get-ScoutInventoryDrift Get-ScoutCostAnomaly Get-ScoutIacGap Import-ScoutConfig Export-ScoutConfig

PSEditions

Core

Dependencies

This module has no dependencies.

Release Notes

v2.5.3 -- A normal Azure response aborted the entire inventory run (AB#5633). A run against a real tenant died right after the API inventory phase with "The property 'ReservationRecomen' cannot be found on this object." This was not a null-reference fault. Every src/*.ps1 sets Set-StrictMode -Version Latest at file scope and AzureScout.psm1 dot-sources them, so the whole module including the v1 inventory path runs strict, and under StrictMode member enumeration over a collection reports the property missing when the enumeration yields nothing at all -- which is exactly what an empty collection on every element produces, because the empties flatten away. A null value is safe; an empty one is not. The Consumption reservationRecommendations API returns { "value": [] } for a subscription with no recommendations, so a perfectly healthy tenant crashed the run. All seven reads at that site now go through Get-AZSCCollectedValue, which reads element-wise. The same class was swept: $Resources is a mixed array whose Resource Graph rows carry subscriptionId and Type while the REST rows beside them do not, and two collectors running in module scope filtered it with bare property reads -- Get-AZSCVMQuotas on $_.subscriptionId, which meant no quota was collected for any subscription rather than just the offending one, and Get-AZSCVMSkuDetails on $_.TYPE plus an -ExpandProperty over rows without a location. The ~176 inventory modules use the same filter shape safely because they run in fresh runspaces with StrictMode unset, and are unchanged. Diagram jobs never actually waited: Start-AZSCDiagramJob looped on $Job.Runspace.IsCompleted, but those handles are PowerShellAsyncResult and have no Runspace property, so the expression was empty, -contains $false was always false, and EndInvoke raced the work it was collecting; v2.5.2 fixed this same line in Start-AZSCProcessJob and missed this copy. An unavailable Cost Management API destroyed the whole run (AB#5636): Get-AZSCCostInventory ended its catch with throw and the $Costs = @() fallback on the next line was unreachable dead code, so a machine without Az.CostManagement lost the entire report to -IncludeCosts. Cost data is optional enrichment and now warns, naming the install command, and continues. Az.CostManagement is deliberately not auto-installed -- doing so drags in a newer Az.Accounts, and two side-by-side versions make every Import-Module die with a stack overflow inside Az.Accounts' own assembly-load-context resolver. NEW: every run now writes a detailed log into its own run folder with no extra parameter (AB#5634, AB#5635). scout-run.log carries a metadata header, every phase boundary with elapsed time and counts, warnings, and on failure the full error record -- message, exception type, failing script, line number, statement and script stack trace; scout-console.log carries the console transcript. A failed run prints the log path before exiting. Logging is best-effort: if the log cannot be written the run still proceeds. It paid for itself immediately -- the Cost Management defect and both mixed-array collector crashes were found by reading the log rather than by re-running with -Debug. v2.5.2 -- A whole report category could silently vanish from a run (AB#5629). Inventory output was non-deterministic: ReportCache/Compute.json came back 5,158 bytes on one run and 470 on the next, same tenant and scope, with every Compute module reporting zero rows while the hashtable keys were still present. The cause was a race, not throttling: Wait-AZSCJob looped only while a job was Running, but Start-Job is asynchronous and a job created moments earlier sits in NotStarted, a state that satisfied neither the wait loop nor the caller job-selection filter, so it was never waited on and Build-AZSCCacheFiles then ran Receive-Job followed by Remove-Job, destroying it before it produced anything. Both now treat every non-terminal state as pending. Build-AZSCCacheFiles now warns when a job is harvested in a non-Completed state or a category returns no data, naming the category, instead of reporting an empty estate in silence. Also, Build-AZSCExcelComObject surfaced a raw 0x80040154 REGDB_E_CLASSNOTREG on every machine without Excel installed; the report is already complete and saved at that point, so the missing ProgID is now detected up front and explained in one line. v2.5.1 -- Seven fixes that let a full inventory run complete against a real tenant. Every one was found by running the product end to end against live Azure; the 1692-test suite passed throughout because nothing drove the extraction, processing and reporting chain against real collector output. Extraction: $MGContainerExtension was consumed unconditionally by the resourcecontainers query but only assigned in the -ManagementGroup branch (AB#5547). Processing: 41 .IsPresent reads on parameters not declared [switch] -- null when the caller omits them (AB#5547). Reporting (AB#5567): ImportExcel throws on a -Style range or -TableName over a worksheet with zero data rows; the cost and update-manager worksheets read VM property names the collector never emitted, so those sheets had never carried VM rows; 29 worksheet dereferences threw whenever the estate produced no such sheet; 10 pivot titles were read before assignment; and the Markdown export died on a trailing italic underscore parsed as part of the identifier. First live-tenant verification of the -IncludeDevOps collectors: 166 resources across 74 projects. Full history for every earlier release is in CHANGELOG.md: https://github.com/thisismydemo/azure-scout/blob/main/CHANGELOG.md

FileList

Version History

Version Downloads Last updated
2.11.0 8 7/26/2026
2.10.0 5 7/26/2026
2.9.0 6 7/26/2026
2.8.0 5 7/26/2026
2.7.0 5 7/26/2026
2.6.0 5 7/26/2026
2.5.3 (current version) 4 7/25/2026
2.5.2 6 7/25/2026
2.5.1 4 7/25/2026
2.5.0 5 7/25/2026
2.4.0 4 7/25/2026
2.3.0 6 7/25/2026
2.2.0 4 7/24/2026
2.1.0 5 7/24/2026
2.0.1 5 7/23/2026
2.0.0 3 7/23/2026
1.0.0 48 2/25/2026
Show less