Ms365 Tenant Manager
The Microsoft 365 Tenant Manager skill offers expert guidance and automation for Microsoft 365 Global Administrators.
Install
npx promptshop add ms365-tenant-managerDetails
What This Skill Does
When to Use
Run security audits on the tenant. Bulk provision users from a C
-
SV file.
-
Create conditional access policies.
-
Configure D.
-
NS records for the tenant.
-
Manage user licenses and subscriptions.
-
Automate tenant setup tasks.
Key Features
Provides Power
- Shell scripts for common tasks.
- Offers guidance on setting up new tenants.
- Automates user provisioning and management.
- Helps configure security policies.
- Provides workflows for tenant optimization.
- Integrates with Microsoft Graph A.
PI.
Manual Installation
Manual installation
View Full Skill Content
The complete markdown content that gets installed
Microsoft 365 Tenant Manager
Quick Start
Run a Security Audit
Connect-Mg
-
Graph -Scopes "Directory.
-
Read.
-
All","Policy.
-
Read.
-
All","Audit.
-
Log.
-
Read.
-
All". Get-Mg
SubscribedSku | Select-Object Sku
PartNumber, Consumed
Units, @{N="Total";E={$_.Prepaid
Units. Enabled}} Get-Mg
PolicyAuthorizationPolicy | Select-Object Allow
InvitesFrom, Default
UserRolePermissions
Bulk Provision Users from C
SV
Import-Csv .\new_users.csv | For
Each-Object { $password
Profile = @{ Password = (New-Guid).To
String().Substring(0,16) + "!"; Force
ChangePasswordNextSignIn = $true } New-Mg
User -Display
Name $_.Display
Name -User
PrincipalName $_.User
PrincipalName -Department $_.Department -Account
Enabled -Password
Profile $password
Profile }
$policy = @{ State = "enabled
ForReportingButNotEnforced" # Start in report-only mode Conditions = @{ Users = @{ Include
Roles = $admin
Roles } } Grant
Controls = @{ Operator = "OR"; Built
InControls = @("mfa") } } New-Mg
IdentityConditionalAccessPolicy -Body
Parameter $policy
Workflows
Workflow 1: New Tenant Setup
Step 1: Generate Setup Checklist
Confirm prerequisites before provisioning: Custom domain purchased and accessible for D
NS edits
Step 2: Configure and Verify D
NS Records
After adding the domain in the M365 admin center, verify propagation before proceeding
$domain = "company.com" Resolve-Dns
Name -Name "_msdcs.$domain" -Type NS -Error
Action Silently
Continue Also run from a shell prompt: nslookup -type=MX company.com nslookup -type=T
XT company.com # confirm S
PF record
Wait for D
NS propagation (up to 48 h) before bulk user creation.
Step 3: Apply Security Baseline
Disable legacy authentication (blocks Basic Auth protocols)
$policy = @{ Display
Name = "Block Legacy Authentication" State = "enabled" Conditions = @{ Client
AppTypes = @("exchange
ActiveSync","other") } Grant
Controls = @{ Operator = "OR"; Built
InControls = @("block") } } New-Mg
IdentityConditionalAccessPolicy -Body
Parameter $policy
Enable unified audit log
Step 4: Provision Users
$license
Sku = (Get-Mg
SubscribedSku | Where-Object { $_.Sku
PartNumber -eq "E
NTERPRISEPACK" }).Sku
Id
Import-Csv .\employees.csv | For
Each-Object { try { $user = New-Mg
User -Display
Name $_.Display
Name -User
PrincipalName $_.User
PrincipalName -Account
Enabled -Password
Profile @{ Password = (New-Guid).To
String().Substring(0,12)+"!"; Force
ChangePasswordNextSignIn = $true } Write-Host "Provisioned: $($_.User
PrincipalName)" } catch { Write-Warning "Failed $($_.User
PrincipalName): $_" } }
Validation: Spot-check 3–5 accounts in the M365 admin portal; confirm licenses show "Active."
Workflow 2: Security Hardening
Step 1: Run Security Audit
Connect-Mg
-
Graph -Scopes "Directory.
-
Read.
-
All","Policy.
-
Read.
-
All","Audit.
-
Log.
-
Read.
-
All","Reports.
-
Read.
-
All".
Export Conditional Access policy inventory Get-Mg
IdentityConditionalAccessPolicy | Select-Object Display
Name, State | Export-Csv .\ca_policies.csv -No
TypeInformation
Find accounts without M
FA registered $report = Get-Mg
ReportAuthenticationMethodUserRegistrationDetail $report | Where-Object { -not $_.Is
MfaRegistered } | Select-Object User
PrincipalName, Is
MfaRegistered | Export-Csv .\no_mfa_users.csv -No
TypeInformation
- Write-Host "Audit complete. Review ca_policies.csv and no_mfa_users.csv.".
Step 2: Create M
FA Policy (report-only first)
$policy = @{ Display
Name = "Require M
FA All Users" State = "enabled
ForReportingButNotEnforced" Conditions = @{ Users = @{ Include
Users = @("All") } } Grant
Controls = @{ Operator = "OR"; Built
InControls = @("mfa") } } New-Mg
IdentityConditionalAccessPolicy -Body
Parameter $policy
Validation: After 48 h, review Sign-in logs in Entra ID; confirm expected users would be challenged, then change State to "enabled".
Step 3: Review Secure Score
Retrieve current Secure Score and top improvement actions
Get-Mg
SecuritySecureScore -Top 1 | Select-Object Current
Score, Max
Score, Active
UserCount Get-Mg
SecuritySecureScoreControlProfile | Sort-Object -Property Action
Type | Select-Object Title, Implementation
Status, Max
Score | Format-Table -Auto
Size
Workflow 3: User Offboarding
Step 1: Block Sign-in and Revoke Sessions
$upn = "departing.user@company.com" $user = Get-Mg
User -Filter "user
PrincipalName eq '$upn'"
Block sign-in immediately Update-Mg
User -User
Id $user. Id -Account
Enabled:$false
Revoke all active tokens Invoke-Mg
InvalidateAllUserRefreshToken -User
Id $user. Id Write-Host "Sign-in blocked and sessions revoked for $upn"
Step 2: Preview with -What
If (license removal)
Identify assigned licenses
Dry-run: print what would be removed $licenses | For
Each-Object { Write-Host "[What
If] Would remove S
KU: $_" }
Step 3: Execute Offboarding
Remove licenses
Convert mailbox to shared (requires Exchange
OnlineManagement module) Set-Mailbox -Identity $upn -Type Shared
Remove from all groups Get-Mg
UserMemberOf -User
Id $user. Id | For
Each-Object { try { Remove-Mg
GroupMemberByRef -Group
Id $_.Id -Directory
ObjectId $user. Id } catch {} } Write-Host "Offboarding complete for $upn"
Validation: Confirm in the M365 admin portal that the account shows "Blocked," has no active licenses, and the mailbox type is "Shared."
Best Practices
Tenant Setup
Enable M
FA before adding users Configure named locations for Conditional Access Use separate admin accounts with P
IM Verify custom domains (and D
NS propagation) before bulk user creation Apply Microsoft Secure Score recommendations
Security Operations
Start Conditional Access policies in report-only mode Review Sign-in logs for 48 h before enforcing a new policy Never hardcode credentials in scripts — use Azure Key Vault or Get-Credential Enable unified audit logging for all operations Conduct quarterly security reviews and Secure Score check-ins
Power
Shell Automation
Prefer Microsoft Graph (Microsoft. Graph module) over legacy M
SOnline Include try/catch blocks for error handling Implement Write-Host/Write-Warning logging for audit trails Use -What
If or dry-run output before bulk destructive operations Test in a non-production tenant first