diff --git a/CHANGELOG.md b/CHANGELOG.md index d8fe09b..069243e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,24 @@ The format follows [Conventional Commits](https://www.conventionalcommits.org/) +## [1.2.2] - 2026-09-24 + +Patch release for the Intune Anomalies report. + +### Changes + +- **Autopilot device preparation (v2) is recognised.** The *Not in Autopilot* tab (was *No Autopilot Hash*) only lists devices with neither a hardware hash nor a corporate identifier. +- **Cloud PCs are left out of the BitLocker and Autopilot tabs**, where they were always false positives. +- **Every tab explains what it checks.** +- **Noncompliant reasons use the names from the Intune admin center**, e.g. *Require BitLocker* or *Is active (no compliance check-in in the last 31 days)*. + +### Fixes + +- **Noncompliant reason no longer shows "Unknown"** for devices that fail the built-in Default Device Compliance Policy. +- **Application failure percentages are correct** (100% was shown as 1%). + +--- + ## [1.2.1] - 2026-06-18 Patch release - fixes a perf regression and a missing-data symptom in the Intune Anomalies report's compliance fetch, plus a layout fix that affects every report. diff --git a/Tests/Consistency.Tests.ps1 b/Tests/Consistency.Tests.ps1 index cb54372..2c7dfd1 100644 --- a/Tests/Consistency.Tests.ps1 +++ b/Tests/Consistency.Tests.ps1 @@ -148,6 +148,25 @@ Describe 'Public report cmdlet shape contracts' { } } +Describe 'Compliance setting friendly names' { + BeforeAll { + Remove-Module -Name 'RKSolutions' -ErrorAction SilentlyContinue + Import-Module (Get-RKSolutionsManifestPath) -Force + } + + It 'No friendly name contains ", " (the Noncompliant tab splits reasons on it)' { + $bad = InModuleScope RKSolutions { $script:ComplianceSettingFriendlyNames.Values | Where-Object { $_ -like '*, *' } } + $bad | Should -BeNullOrEmpty + } + + It 'Translates known rules and passes unknown ones through' { + InModuleScope RKSolutions { + ConvertTo-ComplianceSettingFriendlyName 'Windows10CompliancePolicy.BitLockerEnabled' | Should -Be 'Require BitLocker' + ConvertTo-ComplianceSettingFriendlyName './Vendor/MSFT/Custom/Thing' | Should -Be './Vendor/MSFT/Custom/Thing' + } + } +} + Describe 'BitLocker / LAPS anomaly resolver output contracts' { # The HTML template emits cells for each property in a specific order; # if these resolvers ever stop emitting one of these columns, the rendered diff --git a/docs/CMDLET-REFERENCE.md b/docs/CMDLET-REFERENCE.md index df37187..bfda429 100644 --- a/docs/CMDLET-REFERENCE.md +++ b/docs/CMDLET-REFERENCE.md @@ -54,7 +54,7 @@ Connect first with **Connect-RKGraph**; this cmdlet uses the existing connection ## Get-IntuneAnomaliesReport -Generates an interactive HTML report covering Intune app failures, multi-user devices, missing Autopilot hashes, inactive devices, non-compliant devices, disabled primary users, BitLocker key escrow, Windows LAPS backup, and deprecated Settings Catalog settings. +Generates an interactive HTML report covering Intune app failures, multi-user devices, devices not registered for Autopilot, inactive devices, non-compliant devices, disabled primary users, BitLocker key escrow, Windows LAPS backup, and deprecated Settings Catalog settings. | Parameter | Description | diff --git a/module/Private/Get-RKSolutionsReportTemplate.ps1 b/module/Private/Get-RKSolutionsReportTemplate.ps1 index 8fc23df..245f71c 100644 --- a/module/Private/Get-RKSolutionsReportTemplate.ps1 +++ b/module/Private/Get-RKSolutionsReportTemplate.ps1 @@ -459,6 +459,21 @@ input:checked + .rk-theme-toggle-slider:before { transform: translateX(18px); } [data-theme="dark"] .rk-stat-tile.t-pink .rk-stat-eyebrow { color: var(--tile-pink-eyebrow); opacity: 1; } [data-theme="dark"] .rk-stat-tile.t-pink .rk-stat-caption { color: var(--tile-pink-caption); opacity: 1; } +/* --- Tab intro (what this tab checks) --- */ +.rk-tab-intro { + background: var(--accent-soft); + border: 1px solid var(--border); + border-left: 3px solid var(--accent); + border-radius: 10px; + padding: 12px 18px; + margin-bottom: 16px; + font-family: 'Geist', -apple-system, sans-serif; + font-size: 0.85rem; + line-height: 1.5; + color: var(--text-body); +} +.rk-tab-intro strong { color: var(--text); } + /* --- Filter Bar --- */ .rk-filter-bar { background: var(--bg-elevated); diff --git a/module/Private/IntuneAnomalies.ps1 b/module/Private/IntuneAnomalies.ps1 index dd2fae4..a14d72e 100644 --- a/module/Private/IntuneAnomalies.ps1 +++ b/module/Private/IntuneAnomalies.ps1 @@ -81,7 +81,7 @@ function New-IntuneAnomaliesHTMLReport { "@ } - # Generate table rows for Non-company owned devices + # Generate table rows for devices not registered for Autopilot $noAutopilotHashRows = "" foreach ($item in $Report_DevicesWithoutAutopilotHash) { $noAutopilotHashRows += @" @@ -230,9 +230,9 @@ function New-IntuneAnomaliesHTMLReport {
Non-shared devices
-
NO AUTOPILOT HASH
+
NOT IN AUTOPILOT
$Report_DevicesWithoutAutopilotHash_Count
-
Missing hardware hash
+
No hash or corporate identifier
INACTIVE DEVICES
@@ -277,7 +277,7 @@ function New-IntuneAnomaliesHTMLReport {
- + @@ -289,6 +289,7 @@ function New-IntuneAnomaliesHTMLReport {
+
What we check: Windows apps in Intune with at least one failed installation, taken from the Intune app install status report and sorted by number of failed devices.
Filters: @@ -399,8 +401,9 @@ function New-IntuneAnomaliesHTMLReport {
- +
+
What we check: Windows devices that are not registered for Autopilot at all: no hardware hash (Autopilot) and no corporate identifier (Autopilot device preparation). Cloud PCs and Dev Boxes are left out.
Filters: @@ -453,6 +456,7 @@ function New-IntuneAnomaliesHTMLReport {
+
What we check: Devices that have not synced with Intune in the last 90 days.
Filters: @@ -569,6 +574,7 @@ function New-IntuneAnomaliesHTMLReport {
+
What we check: Overview of every Windows device with its OS edition and Windows version. Use it to spot unexpected editions: a device running Pro where you expect Enterprise cannot use Enterprise-only features such as Credential Guard, so policies that rely on them silently do nothing.
Filters: @@ -672,6 +679,7 @@ function New-IntuneAnomaliesHTMLReport {
+
What we check: Windows devices that are not encrypted, have no BitLocker policy assigned, or are encrypted without an OS-volume recovery key stored in Entra ID. Cloud PCs and Dev Boxes are left out. Devices deliberately excluded from BitLocker policies are hidden unless the report runs with -ShowExcludedDevices.
Filters: @@ -783,6 +792,7 @@ function New-IntuneAnomaliesHTMLReport {
+
What we check: Settings in your Settings Catalog policies that Microsoft has marked as deprecated. These may stop working or be removed in a future Intune release.
Filters: