XrmToolSuite.EnvironmentInventory
1.2026.7.14
dotnet add package XrmToolSuite.EnvironmentInventory --version 1.2026.7.14
NuGet\Install-Package XrmToolSuite.EnvironmentInventory -Version 1.2026.7.14
<PackageReference Include="XrmToolSuite.EnvironmentInventory" Version="1.2026.7.14" />
<PackageVersion Include="XrmToolSuite.EnvironmentInventory" Version="1.2026.7.14" />
<PackageReference Include="XrmToolSuite.EnvironmentInventory" />
paket add XrmToolSuite.EnvironmentInventory --version 1.2026.7.14
#r "nuget: XrmToolSuite.EnvironmentInventory, 1.2026.7.14"
#:package XrmToolSuite.EnvironmentInventory@1.2026.7.14
#addin nuget:?package=XrmToolSuite.EnvironmentInventory&version=1.2026.7.14
#tool nuget:?package=XrmToolSuite.EnvironmentInventory&version=1.2026.7.14
📋 Environment Inventory
An XrmToolBox plugin that collects a normalized, searchable inventory of a Dataverse environment — across metadata, solutions, security, automation, and web/dev components — with per-component detail and multi-format export. Read-only, and secret values are never read or exported.
Features
Each data source runs in its own fail-soft try/catch: a permission gap degrades to an "unavailable source" note rather than a hard error.
| Category | What it inventories |
|---|---|
| Metadata & solutions | Solutions/publishers (managed state, version); tables via RetrieveAllEntitiesRequest with per-table column count and managed/custom state |
| Security | Security roles, users, teams, business units (key attributes only — no credentials/secrets) |
| Automation | Plugin assemblies + SDK steps; workflows/business rules/actions/BPFs/modern flows (by category, with state) |
| Web / dev | Web resources, PCF custom controls (degrades if absent), custom APIs (type + managed state) |
| Configuration | Environment-variable definitions (schema name, display name, declared type) and connection references (logical name, connector id) — never any value/secret column |
- Search & filter — a search box plus category and managed-state dropdowns drive the grid; filtering is
client-side over the cached snapshot (
InventorySnapshot.Filter), fast on large environments. Search is debounced (re-filters once typing pauses, not on every keystroke), and a "Filtering…" badge with a wait cursor appears over the grid while a filter/sort/re-bind runs so a large environment never looks hung. - Column sorting — click any column header to sort ascending, click again for descending (a sort glyph
marks the active column). Sorting re-orders the cached model and re-binds the grid, so it stays responsive
on 100k+ component environments — it deliberately does not use
DataGridView's built-in unbound sort, which blocks the UI thread at that scale. - Detail panel — selecting a row shows its normalized fields plus the source-specific
Detailsdictionary.
The normalization model (InventoryItem/InventorySnapshot), exporters, and summary projection are
UI-free and SDK-free (unit-tested); the Dataverse collector is a separate file. Retrieval uses the shared
RetrieveAll (paging + cancellation) off the UI thread with progress.
Exports
Exports reflect the current view — every format writes only the rows left by the active category/managed/search filter and in the current sort order, matching the grid (the status bar confirms the exported count, e.g. "Exported 163 component(s)"). Clear the filters to export the full inventory.
Excel, CSV, JSON, Markdown, HTML, Word, and PDF. CSV is RFC-4180 quoted; HTML is self-contained (inline
CSS); the text formats carry a summary counts table; Excel produces the inventory grid (Summary +
Items worksheets, no secret column) via ClosedXML. Word and PDF produce an inventory catalog —
a title block, key-metric counts, and the records themselves grouped by category (Type / Name / Schema /
Managed / Modified) — via the tool-local InventoryWordExporter (DocumentFormat.OpenXml from the ClosedXML
chain) and InventoryPdfExporter (PdfSharp/MigraDoc-GDI). These deliberately do not use the suite's
score/severity analyzer report template (an inventory is a catalog, not an assessment), so there is no risk
gauge or severity grid. Export scope (selected sources) round-trips via settings.
Help & Support
A right-aligned Help button opens a Help & Support dialog with Documentation, Report an issue,
and a support link, each opened in the browser. The tool implements IHelpPlugin and IGitHubPlugin, so
XrmToolBox's own tool-menu links resolve to the same GitHub project (kkora/XrmToolSuite).
Build & install
This tool is not a single-DLL tool — it ships the Excel/PDF/Word export dependency chains (the ClosedXML + PdfSharp/MigraDoc-GDI DLLs; the Word exporter reuses the OpenXML assembly from the ClosedXML chain). The one-step build copies the whole chain into the XrmToolBox Plugins root for you:
dotnet build src\Tools\XrmToolSuite.EnvironmentInventory\XrmToolSuite.EnvironmentInventory.csproj -c Release -p:DeployToXTB=true
Then restart XrmToolBox and open Environment Inventory. For a manual copy to another machine, copy
every DLL from the tool's bin\Release\net48\ folder — flat in the Plugins root, never a subfolder — or
XrmToolBox silently drops the tool. Full details in ./DEPLOYMENT.md and the suite guide
Deployment_Guide_XrmToolBox.md.
Usage
- Connect to your environment (System Customizer or higher recommended).
- Load the inventory — sources are collected via
RetrieveAlloff the UI thread with progress and cancellation. - Search and filter by category, name, and managed state; click a column header to sort (click again to reverse); select a row for its detail panel.
- Export in any of the supported formats.
Notes & limitations
- Read-only; no secrets or credentials are ever persisted or exported — only environment-variable definitions and connection-reference metadata, never any value/secret column.
- Unavailable sources (e.g. a permission gap, or a table absent from the environment) degrade to a noted "unavailable source" rather than aborting the run.
- The normalization model is UI-free/SDK-free and unit-tested in
testing/UnitTests/EnvironmentInventoryTests.cs.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET Framework | net48 is compatible. net481 was computed. |
-
- XrmToolBox (>= 1.2025.10.74)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.2026.7.14 | 153 | 7/20/2026 |
| 1.2026.7.13 | 101 | 7/11/2026 |
| 1.2026.7.10 | 97 | 7/11/2026 |
| 1.2026.7.9 | 95 | 7/11/2026 |
| 1.2026.7.8 | 101 | 7/11/2026 |
| 1.2026.7.7 | 106 | 7/11/2026 |
| 1.2026.7.6 | 107 | 7/10/2026 |
| 1.2026.7.5 | 102 | 7/9/2026 |
| 1.2026.7.3 | 93 | 7/7/2026 |
| 1.2026.7.2 | 95 | 7/5/2026 |
Click a column header to sort (no more freeze on large environments); debounced search with a "Filtering…" progress indicator; "Load inventory" button; exports now honour the active filter; Word/PDF exports are an inventory catalog (records grouped by category) instead of the score/severity report.