mirror of
https://github.com/Micke-K/IntuneManagement.git
synced 2026-09-28 10:55:38 +02:00
231 lines
14 KiB
Markdown
231 lines
14 KiB
Markdown
# Release Notes
|
|
|
|
## 4.0.0-beta1 - 2026-09-23
|
|
|
|
**This is a beta release.** 4.0 is a full rewrite of IntuneManagement. The feature set is
|
|
broadly familiar, but nearly every internal has changed. Test it against a lab tenant before
|
|
pointing it at production.
|
|
|
|
**Version 3 remains the supported release.** It stays on the default branch and keeps getting
|
|
fixes until 4.0 leaves beta. 4.0 lives on the `v4` branch until then, and the in-application
|
|
update check will not offer it to a 3.x installation while it is a pre-release. Run 4.0
|
|
alongside 3.x if you like: they keep their settings in different places and neither reads the
|
|
other's.
|
|
|
|
<br />
|
|
|
|
**BREAKING CHANGES**
|
|
|
|
These are the things that stop working if 4.0 simply replaces 3.x in an existing setup.
|
|
|
|
- **Every pipeline and scheduled job has to be rewritten.** The 3.x silent mode -
|
|
`Start-IntuneManagement.ps1 -Silent -SilentBatchFile <file>` driving a `BulkExport.json`
|
|
or `BulkImport.json` exported from the forms, with `%Date%`, `%DateTime%` and
|
|
`%Organization%` in paths - is gone, and 4.0 does not read those files. The launcher
|
|
switches (`-TenantId`, `-AppId`, `-Secret`, `-Certificate`, `-JSonSettings`) are gone
|
|
with it. The replacement is the public commands: `Connect-IMIntuneManagement` for the
|
|
credentials, `Start-IMGraphBulkExport` / `-Import` / `-Documentation` for the work, and
|
|
`Import-IMSettingsStore` for a settings file kept in source control. A 3.x nightly export
|
|
becomes:
|
|
|
|
```powershell
|
|
Import-Module .\IntuneManagement.psd1
|
|
Connect-IMIntuneManagement -TenantId $tenant -AppId $app -Secret $secret
|
|
Start-IMGraphBulkExport -ExportFolder "C:\Export\$(Get-Date -Format yyyy-MM-dd)" -ExportAssignments $true
|
|
```
|
|
|
|
See [Docs/Examples.md](Docs/Examples.md) for the other operations.
|
|
- **Settings do not carry over.** 3.x keeps its settings under
|
|
`HKCU\Software\CloudAPIPowerShellManagement`; 4.0 uses `HKCU\Software\IntuneManagement`,
|
|
and it does not read the 3.x JSON settings file either. The first start of 4.0 has a
|
|
blank configuration: custom app id, export folders, documentation options and every
|
|
other setting are entered again. That is also why the two versions can run side by side
|
|
without touching each other.
|
|
- **The cached sign-in does not carry over.** The token cache lives in a per-version data
|
|
folder (`%LOCALAPPDATA%\IntuneManagement` in 4.0), so the first start of 4.0 is a fresh
|
|
sign-in, on every machine.
|
|
- **Two export folders changed case.** `AutoPilot` is now `Autopilot` and
|
|
`HardwareConfigurations` is now `hardwareConfigurations`. Import matches folder names
|
|
case-insensitively, so a 3.x export still imports; but a script that builds a path to
|
|
one of those folders, or a Linux file system, sees two different names. Every other
|
|
export folder keeps its 3.x name, and the JSON inside is compatible in both directions -
|
|
4.0 exports can carry properties 3.x did not write, which 3.x ignores on import.
|
|
- **Two policy types are not in 4.0**, both already disabled in the 3.x code:
|
|
- Intune *Locations* (`managementConditions`). Microsoft removed the object from
|
|
Intune; it only ever served Android device administrator compliance policies.
|
|
- The iOS DEP enrollment profile, which 3.x carried commented out and never listed.
|
|
Neither has been exportable from a current 3.x, so no export folder is orphaned.
|
|
- **Scripts that imported the 3.x extension files will not run.** 4.0 is a single module,
|
|
`IntuneManagement.psd1`, with a documented public command surface; the `Extensions\*.psm1`
|
|
files are gone. Only commands listed in `FunctionsToExport` are supported, and they are
|
|
prefixed `IM`. Anything else is internal and may change without notice.
|
|
|
|
Not breaking, but different: interactive sign-in opens the system browser by default. See
|
|
**Browser sign-in on every platform** below for the reason, the one requirement it puts on a
|
|
custom app registration, and how to turn it off.
|
|
|
|
<br />
|
|
|
|
**New features**
|
|
|
|
- **Runs on Windows, macOS and Linux.**
|
|
A second UI backend built on Avalonia runs the full application outside Windows. The
|
|
original WPF backend remains the default on Windows and is unchanged in behaviour.
|
|
Select a backend with the `IM_UI_BACKEND` environment variable (`WPF`, `Avalonia`, or
|
|
`None` for headless automation). PowerShell 7.4 or later is required for the
|
|
cross-platform UI.
|
|
See [Docs/CrossPlatform.md](Docs/CrossPlatform.md).
|
|
|
|
- **A supported automation API.**
|
|
Every bulk operation available in the UI is also a public command that runs headless with
|
|
no UI loaded: bulk export, import, copy, delete, assignments, scope tags and
|
|
documentation. This is the intended path for DevOps pipelines and scheduled runs.
|
|
|
|
- **Two authentication providers.**
|
|
Selected per connection with `-Provider`:
|
|
- **MSAL** (default) - interactive browser sign-in, the WAM broker on Windows (off by
|
|
default; turn it on only when the app account is your Windows account), client
|
|
secret, certificate, and device code.
|
|
- **OAuth** - a pure PowerShell implementation with no SDK and no DLL dependency.
|
|
Supports client secret, certificate, managed identity, workload identity federation
|
|
(AKS, GitHub Actions OIDC), device code and ROPC.
|
|
|
|
Multiple tenants can be signed in at once; each Graph call resolves its own token.
|
|
|
|
A token acquired elsewhere can also be supplied directly with `-Token` (a BYO token).
|
|
That is the only way to reach APIs Microsoft does not expose to public client
|
|
applications. A BYO token cannot be refreshed - when it expires, supply a new one.
|
|
|
|
- **Browser sign-in on every platform.**
|
|
Interactive sign-in opens the system browser on Windows, macOS and Linux, by default.
|
|
It is the default because it is the one place every sign-in method works: passkeys, FIDO2
|
|
security keys, Windows Hello and phishing-resistant policies, none of which the embedded
|
|
window can complete, and it reuses the browser session you already have. The requirement
|
|
is the `http://localhost` redirect URI on the app registration; the default Microsoft
|
|
application has it, a custom one may need it added. The setting **Use system browser for
|
|
login** turns it off, in which case Windows uses the embedded window, or WAM when that is
|
|
on. When no browser can be launched - a server session, a container, an SSH shell - the
|
|
sign-in falls back to device code automatically rather than hanging. Device code can also
|
|
be requested directly with `-DeviceCode`, which supports MFA, FIDO2 and security keys
|
|
because the browser step happens on another device.
|
|
|
|
- **Light and dark themes that follow the OS.**
|
|
Both UI backends ship light and dark themes, and by default the whole application follows
|
|
the desktop theme - the Windows app theme, the macOS appearance setting, and the GNOME
|
|
colour scheme on Linux. It switches as soon as the OS setting
|
|
changes, with no restart. Light or Dark can also be selected explicitly with the
|
|
`AppTheme` setting. Linux desktops other than GNOME have no common way to report this, so
|
|
they default to Light unless a theme is chosen.
|
|
|
|
- **Access marking uses the user's Intune role, not only the app's scopes.**
|
|
The menu already marked policy types the app's token could not use. It now also asks
|
|
Intune what the signed-in user's role allows (`getEffectivePermissions`), so a user with a
|
|
read-only Intune role sees the affected types in orange even when the app holds
|
|
ReadWrite scopes. The Profile popup gains a **Permissions** button listing the token,
|
|
role and effective level per type, and `Get-IMGraphEffectivePermissions` returns the same
|
|
for scripts. Intune Administrator / Global Administrator skip the lookup. After a PIM
|
|
activation or a new role assignment, click **Refresh** in the Profile popup - the answer
|
|
follows the token. Setting `UseRbacAccessMarking` (default on) turns it off.
|
|
See [Docs/EffectivePermissions.md](Docs/EffectivePermissions.md).
|
|
|
|
- **Graph API call log.**
|
|
A **Graph Calls** view lists every Graph request the session has made - method, URL,
|
|
status code, duration and size - with filtering and refresh. It makes a slow export or an
|
|
unexpected permission error diagnosable without turning on verbose logging or reading the
|
|
log file.
|
|
|
|
- **Settings and automation.**
|
|
Settings can be read from and written to the registry, a JSON file, or an in-memory
|
|
store that touches nothing on the machine. A run can import a settings file from source
|
|
control, execute, and leave no trace. Settings resolve per tenant or globally.
|
|
See [Docs/Settings.md](Docs/Settings.md).
|
|
|
|
- **Documentation engine.**
|
|
Policies can be documented to HTML, Markdown, Word, JSON, CSV, or Confluence storage
|
|
format. Output providers, per-@odata.type handlers and input providers are all
|
|
registries, so a new output format or a new policy type is an added file rather than an
|
|
edit to a central switch. Enrollment notifications, Windows Hello for Business, Windows
|
|
Restore and both Android enrollment profile types document with their portal labels for
|
|
the first time, and the tenant-default enrollment policies - five of them share the name
|
|
"All users and all devices" - are titled by their type.
|
|
|
|
- **Cross-tenant migration only creates what the policy actually uses.**
|
|
Import creates referenced Entra groups and assignment filters in the target tenant and
|
|
rewrites assignment ids to match, and AD-synced source groups are recreated as cloud
|
|
groups. The change from 3.x is scope: only the groups a policy actually references are
|
|
created. 3.x imported every exported group, even when a single policy referenced one of
|
|
them.
|
|
|
|
- **Bulk scope tags.**
|
|
Add, replace or remove scope tags across policy types or whole policy groups, with an
|
|
orphan-cleanup mode that removes references to scope tags that no longer exist.
|
|
|
|
- **Bulk assignments.**
|
|
Add, replace or remove assignments across policy types or groups, including include and
|
|
exclude targets, assignment filters, app install intents and health-script schedules.
|
|
|
|
- **Graph batching and parallelism.**
|
|
Requests are batched, and on PowerShell 7 batches can run in parallel. Both are settings.
|
|
On a large tenant this is the difference between a 26-minute and a 4-minute full export.
|
|
See [Docs/GraphBatching.md](Docs/GraphBatching.md).
|
|
|
|
- **Multi Admin Approval support.**
|
|
When a tenant requires approval for a Graph write, the pending-approval response is
|
|
detected and the approval code is returned to the caller rather than surfacing as an
|
|
opaque HTTP 403.
|
|
|
|
- **Continuous Access Evaluation.**
|
|
Claims challenges are handled and the request is retried transparently.
|
|
|
|
<br />
|
|
|
|
**Behind the scenes**
|
|
|
|
- **PowerShell classes throughout.**
|
|
Policy types, policy objects, authentication providers, compare providers and
|
|
documentation handlers are now PowerShell classes with real inheritance. A policy type
|
|
inherits its export, import, copy, compare and documentation behaviour from a base class
|
|
and overrides only what differs, instead of each feature carrying a switch statement over
|
|
every object type. Adding a policy type is a new subclass file - there is no central list
|
|
to edit.
|
|
|
|
- **Self-registering extension points.**
|
|
Authentication providers, documentation output formats, per-object-type documentation
|
|
handlers and compare providers all register themselves when they load. Adding one is
|
|
adding a file.
|
|
|
|
- **One engine, two user interfaces.**
|
|
The WPF and Avalonia backends implement the same contract and contain no feature logic of
|
|
their own, so both call exactly the same code underneath. That is also what makes the
|
|
headless automation API possible.
|
|
|
|
- **An automated test suite.**
|
|
The engine is covered by an offline suite, and by an online release gate that exercises
|
|
the full import, export, update, scope tag, assignment, documentation, copy, compare and
|
|
delete lifecycle against a live tenant before a release is published. Both run in the
|
|
development repository; this package is the application, without the test assets.
|
|
|
|
<br />
|
|
|
|
**Known limitations in this beta**
|
|
|
|
- The Avalonia backend is new. It has been exercised on Windows, macOS and Linux, but far
|
|
less than the WPF backend has been over the life of 3.x.
|
|
- Application content cannot be exported unless the encryption information is available.
|
|
Graph has no API for downloading decrypted app content, so an app whose encryption info
|
|
the tenant no longer exposes can be exported as a policy but not as an installable
|
|
package.
|
|
- Inventory Policies will fail to list. Microsoft does not allow public client applications
|
|
to call that API. It works with a BYO token - see **Two authentication providers**.
|
|
- APIs that require additional licensing will fail for tenants without the licence. The
|
|
object type is still listed; the request returns an error rather than an empty result.
|
|
- A few policy types have no dedicated documentation renderer yet: Apple enrollment types,
|
|
iOS app provisioning profiles, Inventory Policies, Entra and Intune branding, Terms and
|
|
Conditions, Windows quality update policies and Windows 365. They document as their basic
|
|
information plus one row per property. The **Document unsupported types** option turns
|
|
that off, in which case they are skipped with a log entry rather than written out empty.
|
|
- Copying a built-in administrative template can drop presentation values for settings that
|
|
use them. Custom (ingested) ADMX is unaffected.
|
|
- The `ADMX Files` policy type supports View, Import and Export only.
|
|
- Types under `Intune Info` are read-only by design - Export and View only.
|