81c5e96fc7
Read-Host has no tab-completion (that's a top-level PSReadLine feature, not available to script prompts), so reuse the fzf dependency already required for menus to browse folders interactively instead: navigate into subfolders, go up with .., confirm current folder, or type a path manually. Falls back to plain Read-Host when fzf isn't installed. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
13 KiB
13 KiB
macOS Intune Toolkit Changelog
2026-08-07 — v4.4.0 — Folder browser for Export/Import path prompts
Added
Scripts/Private/Start-IntuneManagementTui.ps1- New
Select-FolderPathhelper: whenfzfis available, the Export/Import root folder prompt (and the report flow's export/backup-root/output-dir prompts) becomes an interactive folder browser — navigate into subfolders, go up with.., confirm the current folder, or type a path manually.Read-Hostalone has no tab-completion (that's a top-level PSReadLine feature, not available to script prompts), so this reuses thefzfdependency already required for menus instead of building custom completion. - Falls back to a plain
Read-Hostprompt whenfzfisn't installed — no regression from prior behavior.
- New
2026-08-07 — v4.3.1 — Fix redundant action prompt
Fixed
Scripts/Private/Start-IntuneManagementTui.ps1- Choosing 1. Export policies or 2. Import policies in the launcher still re-asked "Select action" (Export/Import/DeployCISBaseline/GenerateReports) — the same missing-passthrough issue as the tenant re-prompt fix below, just for
-Action. Now accepts-Actionand skips the prompt when it's already supplied.
- Choosing 1. Export policies or 2. Import policies in the launcher still re-asked "Select action" (Export/Import/DeployCISBaseline/GenerateReports) — the same missing-passthrough issue as the tenant re-prompt fix below, just for
Start-IntuneToolkit.ps1/Scripts/Start-HeadlessIntune.ps1- Menu items 1/2 now pass
-Action Export/-Action Importthrough to the headless script and on to the TUI.
- Menu items 1/2 now pass
2026-08-07 — v4.3.0 — Bulk delete tool and TUI fixes
Added
Scripts/Bulk-DeletePolicies.ps1- Select object type, filter by name, multi-select objects, and delete them from the tenant.
- Requires typing
DELETEto confirm since the operation is irreversible. Supports-WhatIfdry-run. - Wired into
Start-IntuneToolkit.ps1as menu item 21. Bulk delete policies.
Fixed
Start-IntuneToolkit.ps1- Fixed an infinite loop when
fzfis not installed: the numbered-menu fallback returned"EXIT"for the tenant-selection Exit option, but the check only matched the fzf path's"[Exit]"string, so choosing Exit was silently ignored and the tenant became the literal string"EXIT".
- Fixed an infinite loop when
Scripts/Private/Start-IntuneManagementTui.ps1- The interactive Export/Import/GenerateReports/DeployCISBaseline flow always re-prompted for a Tenant ID even when the tenant was already selected in the outer launcher, because it was invoked with no parameters and had an empty
param()block. It now accepts-TenantIdand skips its three tenant prompts when the value is already supplied. - Clarified the "Name filter" prompt text — it's a plain case-insensitive substring match, not a regex (the underlying match escapes the value via
[RegEx]::Escape()), so the old'^Win-OIB-'example was misleading.
- The interactive Export/Import/GenerateReports/DeployCISBaseline flow always re-prompted for a Tenant ID even when the tenant was already selected in the outer launcher, because it was invoked with no parameters and had an empty
Scripts/Start-HeadlessIntune.ps1- Passes
-TenantIdthrough toStart-IntuneManagementTui.ps1so the fix above takes effect.
- Passes
2026-06-23 — v4.2.0 — Entra directory role membership export
Added
-
Scripts/Export-EntraRoleMembership.ps1- Exports all active and PIM-eligible Microsoft Entra directory role memberships to CSV.
- Expands group-assigned roles to transitive group members.
- Marks whether each role is privileged.
- Supports the toolkit's standard
-AuthMode(AppOnly,Browser,DeviceCode) and reads saved credentials fromSettings.json/macOS Keychain.
-
Start-IntuneToolkit.ps1- Added menu item 20. Export Entra role membership that launches the new script and prompts for the CSV output path.
-
README.md- Listed
Scripts/Export-EntraRoleMembership.ps1in the entry points and documented its purpose.
- Listed
Repository hygiene
.gitignore- Ignore the local
accounts/folder and stray operational shell scripts (deploy.sh,restart_gateways.sh).
- Ignore the local
2026-06-22 — Expanded settings report coverage and Conditional Access documentation
Added
-
Scripts/Export-SettingsReport.py- Greatly expanded coverage: Settings Catalog, Compliance Policies V2, Endpoint Security, Device Management Intents, Administrative Templates, Device Configuration (with OMA-URI expansion), Compliance Policies V1, PowerShell/Shell/Compliance/Health scripts (base64-decoded previews), App Protection, App Configuration, Update Policies, Enrollment restrictions, Autopilot, W365, Filters, and more.
- Added dedicated processors for intent-style settings (
_Settings.jsoncompanion files) and ADMX definition values. - Added base64 decoding for script content with a configurable preview length.
-
Scripts/Invoke-ConditionalAccessDocumentation.ps1- New menu-driven Conditional Access policy documentation script (menu item 19 in
Start-IntuneToolkit.ps1). - Exports CA policies to CSV and optionally Excel, resolving object IDs to display names.
- New menu-driven Conditional Access policy documentation script (menu item 19 in
-
Start-IntuneToolkit.ps1- Added menu item 19. Document Conditional Access policies.
Fixed
.gitignore- Ignore
Scripts/ConditionalAccessDocumentation.csvand.xlsxoutput files so tenant-specific documentation is not committed by accident.
- Ignore
2026-06-14 — Auto-export Settings Catalog definitions for report resolution
Added
-
Extensions/EndpointManager.psm1Start-PostExportSettingsCatalognow auto-exports/deviceManagement/configurationSettingsto<backup-root>/configurationSettings.jsonthe first time a Settings Catalog policy is exported.- New helper
Start-ExportSettingsCatalogDefinitionsfetches all pages of setting definitions and writes them next to the policy folders. - This lets
Scripts/Export-SettingsReport.pyresolvesettingDefinitionIdvalues to the human-readable names shown in the Intune portal without any manual steps. - Errors during definition export are logged but do not fail the policy export.
-
Scripts/Export-SettingsReport.py- New
Platformcolumn betweenPolicyandSetting. - For Settings Catalog, platform is read from the
platformsfield (e.g.macOS,windows10). - For legacy policies, platform is inferred from
platform/platformTypeor from@odata.type(e.g.#microsoft.graph.iosCompliancePolicy→iOS).
- New
Fixed
-
Extensions/MSGraph.psm1Get-GraphMetaDatanow storesGraphMetaData.xmlin the cross-platform data folder (Get-CloudApiDataFolder) instead of the literal Windows path%LOCALAPPDATA%\CloudAPIPowerShellManagement\GraphMetaData.xml.- Removed the stray
%LOCALAPPDATA%\CloudAPIPowerShellManagementfolder from the repository and moved the existingGraphMetaData.xmlto the correct macOS app-data location.
-
Extensions/MSALAuthentication.psm1- On non-Windows platforms the toolkit now skips
TokenCacheHelperExcompilation with an informational log instead of throwing aSystem.Security.Cryptography.ProtectedData.dllerror. - Applied the same skip to the legacy
Add-MSALPrereq_oldfunction for consistency.
- On non-Windows platforms the toolkit now skips
-
.gitignore- Removed the literal
%LOCALAPPDATA%ignore patterns; keptGraphMetaData.xmlandCloudAPIPowerShellManagement/ignores as safeguards.
- Removed the literal
Modified
AGENTS.md- Added
Scripts/Export-SettingsReport.pyto the main entry points table and noted the automatic Settings Catalog name resolution.
- Added
2026-04-16 — v4.1.0 — Accountability, PIM & Auth Management
Modified
-
Scripts/Initialize-IntuneAuth.ps1- App registrations are now named after the authenticated Entra user (e.g.,
IntuneManagement-tomas.kracmar@cqre.net) instead of the local OS username. This improves audit-log traceability when multiple admins use the toolkit against the same tenant. - Added
-Deleteswitch to remove local tenant credentials (Settings.json+ macOS Keychain) without touching the Entra app registration. - Added
-DeleteAppswitch to delete both the Entra app registration and local credentials. - Onboarding now automatically caches the tenant display name after auth setup, so the TUI shows friendly names immediately.
- Added
Organization.Read.Allto theConnect-MgGraphscopes to support tenant name caching.
- App registrations are now named after the authenticated Entra user (e.g.,
-
Scripts/Start-IntuneToolkit.ps1- Added menu items 14 (delete local auth) and 15 (delete auth + app registration) to the TUI.
- Selecting "[+ Onboard new tenant]" now runs the auth initializer immediately and restarts the launcher, instead of dropping into the main menu for an unconfigured tenant.
- The TUI now exits cleanly after deleting tenant auth.
-
README.md- Added Accountability & PIM caveats section explaining the trade-offs of app-only auth versus delegated auth, and how app naming affects audit logs.
2026-04-13 — API Permissions Sync for Initialize-IntuneAuth.ps1
Modified
Scripts/Initialize-IntuneAuth.ps1- Unified the required Microsoft Graph application permissions into a single
$requiredRoleslist defined before app creation/reuse logic:DeviceManagementApps.ReadWrite.AllDeviceManagementConfiguration.ReadWrite.AllDeviceManagementManagedDevices.ReadWrite.AllDeviceManagementScripts.ReadWrite.AllDeviceManagementServiceConfig.ReadWrite.AllDeviceManagementRBAC.ReadWrite.AllGroup.ReadWrite.AllDirectory.Read.AllUser.Read.AllOrganization.Read.AllPolicy.ReadWrite.ConditionalAccessAgreement.ReadWrite.AllCloudPC.ReadWrite.AllApplication.Read.All
- Existing app patching: When reusing an existing app registration, the script now inspects its current
RequiredResourceAccess. If any required permissions are missing, it patches the app viaUpdate-MgApplication, refreshes the local app object, and the downstream admin-consent loop automatically grants consent for the newly added roles.
- Unified the required Microsoft Graph application permissions into a single
Prior delivered changes (context summary)
New scripts added
Scripts/Bulk-AppAssignment.ps1— bulk-assign apps to groups/All Users/All DevicesScripts/Bulk-AssignmentManager.ps1— add/remove assignments for any policy type using correct@odata.typeand bulk/assignendpointScripts/Backup-Restore-Assignments.ps1— JSON backup with cross-tenant group name resolutionScripts/Export-AssignmentsToCsv.ps1— CSV and Markdown documentation outputScripts/Bulk-RenamePolicies.ps1— search/replace, add/strip prefix across displayName/descriptionScripts/Bulk-DeviceOperations.ps1— delete/retire/wipe/lock/sync with-WhatIfsafeguardsScripts/Start-IntuneToolkit.ps1— unified reverse-numberedfzf-based launcherScripts/Initialize-IntuneAuth.ps1— one-time Entra app + secret + Keychain setup
Core / Extensions / Headless changes
Extensions/MSGraph.psm1Invoke-GraphRequestnow throws on 4xx/5xx HTTP errors (was silently returning null)- Added
-AllPagessupport toGet-GraphObjectsand toolkit queries for large tenants
Headless/IntuneManagement.Headless.psm1- Expanded
Get-DefaultIntunePolicyObjectTypesto ~45 types, includingDeviceManagementIntents - Threaded
NameSearchPattern/NameReplacePatternthrough export/import/action flows
- Expanded
- Settings Catalog fixes
- Uses
nameproperty instead ofdisplayNamefor queries/labels - Assignments use
#microsoft.graph.deviceManagementConfigurationPolicyAssignmentand the bulkPOST …/assignendpoint
- Uses
- TUI /
fzf- Spacebar toggle, Esc to go back, reverse numbering (10→1) in unified launcher
2026-04-13 — Declarative Baseline Deployer
Added
-
Scripts/Deploy-IntuneBaseline.ps1- YAML-driven one-click deployment of Intune policies + assignments to new tenants.
- Supports global and per-policy name mutations (
search/replaceorprefix). - Auto-creates cloud-only security groups if missing.
- Idempotent imports with configurable conflict resolution (
Skip,Update,Error). - Full
-WhatIfdry-run support. - Handles 20+ policy types including Settings Catalog (
nameproperty), EndpointSecurity (settings file companion upload), and Applications. - Integrates with existing auth stack (Settings.json / macOS Keychain).
-
Scripts/ConvertTo-IntuneBaseline.ps1- Converts an existing toolkit export folder into a baseline YAML skeleton.
- Maps folder names to baseline types, extracts display names, and generates empty assignment blocks.
-
Baselines/OpenIntuneBaseline.example.yaml- Example manifest demonstrating groups, mutations, policies, and assignments.
Dependencies
powershell-yamlmodule (auto-install prompt if missing).
2026-04-13 — Unified Launcher: Baseline Deployer Integration
Modified
Scripts/Start-IntuneToolkit.ps1- Added menu entries for baseline deployment:
10. Deploy baseline11. Deploy baseline (dry-run / WhatIf)
- Forwards
-WhatIfswitch correctly when dry-run option is selected. - Ensures
WhatIfflag is cleared between loop iterations to avoid leakage to other tools.
- Added menu entries for baseline deployment: