365TUNE
2.3.10
365TUNE PowerShell toolkit for Microsoft 365 license optimization, security compliance, cost reporting, and Azure permissions management.
Installation Options
Owners
Copyright
(c) 2025 Metawise Consulting LLC. All rights reserved.
Package Details
Author(s)
- Metawise Consulting LLC
Tags
Azure Microsoft365 M365 MSP Licensing Security Compliance CIS Entra GDAP ExchangeOnline 365TUNE
Functions
Invoke-365TUNEConnectAll Invoke-365TUNERevokeAll Invoke-365TuneConnectAzure Invoke-365TuneRevokeAzure Invoke-365TuneConnectExchange Invoke-365TuneRevokeExchange Invoke-365TuneConnectTeams Invoke-365TuneRevokeTeams Invoke-365TuneTestAzure Invoke-365TuneTestExchange Invoke-365TuneTestTeams Invoke-365TUNETestAll
Dependencies
This module has no dependencies.
Release Notes
v2.3.10 (bug fix release)
- Fixed Cloud Shell MSI handling (all 12 functions): when Cloud Shell starts with MSI
context, functions now call Connect-AzAccount WITHOUT calling Disconnect-AzAccount first.
This keeps MSI as a fallback while attempting browser-based (portal session) login.
The v2.3.8 approach called Disconnect first, which stripped the MSI fallback and caused
Connect-AzAccount to fail silently, leaving no context at all.
- Fixed Remove-365TuneElevation MSI account quirk: elevation cleanup used SignInName to
find the User Access Administrator assignment, but MSI/SP accounts have no SignInName so
the assignment was never found and left in place. Lookup now uses a REST API call filtered
by principalId (OID from the JWT), which works for both user and MSI/SP accounts. The
Az cmdlet is retained as a fallback.
v2.3.8 (bug fix release)
- Fixed Cloud Shell MSI fallback (all 12 functions): when Cloud Shell is opened outside
the Azure Portal the pre-loaded context is MSI rather than a user account. All functions
now detect this and call Connect-AzAccount (browser-based, no device code) to obtain a
real user context before proceeding instead of throwing immediately.
v2.3.7 (bug fix release)
- Fixed Cloud Shell MSI authentication (all 12 functions): Connect-AzAccount in Cloud Shell
was replacing the pre-loaded user context with the Cloud Shell Managed Service Identity.
All functions now skip Connect-AzAccount in Cloud Shell and use the existing user context.
Added MSI guard: throws a clear error if Cloud Shell context is MSI instead of a user.
v2.3.6 (bug fix release)
- Fixed UnsupportedFilter error in TestAzure, ConnectAzure, and RevokeAzure: root-scope
role assignment queries now include principalId filter required by the Azure ARM API.
Unfiltered queries at '/' scope are rejected by the API with UnsupportedFilter.
v2.3.5 (bug fix release)
- Fixed Cloud Shell authentication: all functions now authenticate as the signed-in user
instead of the VM Managed Identity (MSI). MSI has no Graph API or Exchange Admin
permissions, causing all Cloud Shell runs to fail silently or throw.
- Fixed 5 misplaced backtick line-continuations in ConnectExchange, ConnectTeams,
RevokeTeams that broke command parsing and caused ParameterBindingExceptions.
- Fixed -TimeoutSec and -ErrorAction Stop being bound to Where-Object instead of
Invoke-RestMethod in ConnectAzure and RevokeAzure (6 occurrences).
- Fixed -ErrorAction Stop applied to Out-Null instead of Invoke-RestMethod in
ConnectExchange and ConnectTeams, causing silent swallowing of HTTP errors.
- Fixed RevokeAzure: REST queries between elevation and try/finally block were
unprotected - if they threw, User Access Administrator elevation was never removed.
All post-elevation code is now inside a single try/finally block.
- Updated ConnectExchange and RevokeExchange .DESCRIPTION: now supported in Cloud Shell.
FileList
- 365TUNE.nuspec
- Private\Find-365TuneSP.ps1
- Public\Permissions\Invoke-365TUNEConnectAll.ps1
- Public\Permissions\Invoke-365TuneConnectExchange.ps1
- Public\Permissions\Invoke-365TUNERevokeAll.ps1
- Public\Permissions\Invoke-365TuneRevokeExchange.ps1
- Public\Permissions\Invoke-365TUNETestAll.ps1
- Public\Permissions\Invoke-365TuneTestExchange.ps1
- 365TUNE.psd1
- Private\Invoke-365TuneElevation.ps1
- Public\Permissions\Invoke-365TuneConnectAzure.ps1
- Public\Permissions\Invoke-365TuneConnectTeams.ps1
- Public\Permissions\Invoke-365TuneRevokeAzure.ps1
- Public\Permissions\Invoke-365TuneRevokeTeams.ps1
- Public\Permissions\Invoke-365TuneTestAzure.ps1
- Public\Permissions\Invoke-365TuneTestTeams.ps1
- 365TUNE.psm1
- Private\Remove-365TuneElevation.ps1
Version History
| Version | Downloads | Last updated |
|---|---|---|
| 2.3.19 | 4 | 3/4/2026 |
| 2.3.18 | 4 | 3/4/2026 |
| 2.3.17 | 4 | 3/4/2026 |
| 2.3.16 | 6 | 3/4/2026 |
| 2.3.15 | 3 | 3/4/2026 |
| 2.3.14 | 4 | 3/4/2026 |
| 2.3.13 | 3 | 3/4/2026 |
| 2.3.12 | 4 | 3/3/2026 |
| 2.3.11 | 3 | 3/3/2026 |
| 2.3.10 (current version) | 5 | 3/3/2026 |
| 2.3.9 | 5 | 3/3/2026 |
| 2.3.8 | 4 | 3/3/2026 |
| 2.3.7 | 8 | 2/25/2026 |
| 2.3.6 | 4 | 2/25/2026 |
| 2.3.5 | 6 | 2/25/2026 |
| 2.3.4 | 4 | 2/25/2026 |
| 2.3.2 | 5 | 2/25/2026 |
| 2.3.1 | 6 | 2/25/2026 |
| 2.3.0 | 4 | 2/25/2026 |
| 2.2.9 | 5 | 2/25/2026 |
| 2.2.8 | 4 | 2/25/2026 |
| 2.2.7 | 6 | 2/25/2026 |
| 2.2.6 | 3 | 2/25/2026 |
| 2.2.5 | 5 | 2/25/2026 |
| 2.2.4 | 5 | 2/25/2026 |
| 2.2.3 | 4 | 2/25/2026 |
| 2.2.0 | 4 | 2/25/2026 |
| 2.1.9 | 5 | 2/24/2026 |
| 2.1.8 | 3 | 2/24/2026 |
| 2.1.7 | 8 | 2/21/2026 |
| 2.1.6 | 5 | 2/21/2026 |
| 2.1.5 | 9 | 2/20/2026 |
| 1.9.1 | 7 | 2/19/2026 |