{"id":6005,"date":"2025-09-17T08:29:34","date_gmt":"2025-09-17T06:29:34","guid":{"rendered":"https:\/\/www.msb365.blog\/?p=6005"},"modified":"2025-09-17T08:29:34","modified_gmt":"2025-09-17T06:29:34","slug":"exchange-mail-alias-migration","status":"publish","type":"post","link":"https:\/\/www.msb365.blog\/?p=6005","title":{"rendered":"Exchange Mail Alias Migration"},"content":{"rendered":"<style>\n        * {<br \/>            margin: 0;<br \/>            padding: 0;<br \/>            box-sizing: border-box;<br \/>        }<\/p>\n<p>        body {<br \/>            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;<br \/>            line-height: 1.6;<br \/>            color: #333;<br \/>            background-color: #fafafa;<br \/>        }<\/p>\n<p>        .container {<br \/>            max-width: 1200px;<br \/>            margin: 0 auto;<br \/>            padding: 0 20px;<br \/>        }<\/p>\n<p>        .hero {<br \/>            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);<br \/>            color: white;<br \/>            padding: 80px 0;<br \/>            text-align: center;<br \/>        }<\/p>\n<p>        .hero h1 {<br \/>            font-size: 3rem;<br \/>            font-weight: 700;<br \/>            margin-bottom: 20px;<br \/>            text-shadow: 0 2px 4px rgba(0,0,0,0.3);<br \/>        }<\/p>\n<p>        .hero p {<br \/>            font-size: 1.3rem;<br \/>            opacity: 0.9;<br \/>            max-width: 600px;<br \/>            margin: 0 auto 30px;<br \/>        }<\/p>\n<p>        .download-btn {<br \/>            display: inline-block;<br \/>            background: #28a745;<br \/>            color: white;<br \/>            padding: 15px 30px;<br \/>            text-decoration: none;<br \/>            border-radius: 8px;<br \/>            font-weight: 600;<br \/>            font-size: 1.1rem;<br \/>            transition: all 0.3s ease;<br \/>            box-shadow: 0 4px 15px rgba(40, 167, 69, 0.3);<br \/>        }<\/p>\n<p>        .download-btn:hover {<br \/>            background: #218838;<br \/>            transform: translateY(-2px);<br \/>            box-shadow: 0 6px 20px rgba(40, 167, 69, 0.4);<br \/>        }<\/p>\n<p>        .content {<br \/>            background: white;<br \/>            margin: -40px auto 0;<br \/>            border-radius: 12px;<br \/>            box-shadow: 0 10px 40px rgba(0,0,0,0.1);<br \/>            overflow: hidden;<br \/>            position: relative;<br \/>            z-index: 1;<br \/>        }<\/p>\n<p>        .article-content {<br \/>            padding: 60px;<br \/>        }<\/p>\n<p>        h2 {<br \/>            color: #2c3e50;<br \/>            font-size: 2.2rem;<br \/>            margin: 40px 0 20px;<br \/>            padding-bottom: 10px;<br \/>            border-bottom: 3px solid #667eea;<br \/>        }<\/p>\n<p>        h3 {<br \/>            color: #34495e;<br \/>            font-size: 1.6rem;<br \/>            margin: 30px 0 15px;<br \/>        }<\/p>\n<p>        h4 {<br \/>            color: #555;<br \/>            font-size: 1.3rem;<br \/>            margin: 25px 0 10px;<br \/>        }<\/p>\n<p>        .feature-grid {<br \/>            display: grid;<br \/>            grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));<br \/>            gap: 30px;<br \/>            margin: 40px 0;<br \/>        }<\/p>\n<p>        .feature-card {<br \/>            background: #f8f9fa;<br \/>            padding: 30px;<br \/>            border-radius: 12px;<br \/>            border-left: 5px solid #667eea;<br \/>            transition: transform 0.3s ease;<br \/>        }<\/p>\n<p>        .feature-card:hover {<br \/>            transform: translateY(-5px);<br \/>        }<\/p>\n<p>        .feature-card h4 {<br \/>            color: #667eea;<br \/>            margin-bottom: 15px;<br \/>            font-size: 1.4rem;<br \/>        }<\/p>\n<p>        .code-block {<br \/>            background: #2d3748;<br \/>            color: #e2e8f0;<br \/>            padding: 25px;<br \/>            border-radius: 8px;<br \/>            margin: 20px 0;<br \/>            overflow-x: auto;<br \/>            font-family: 'Consolas', 'Monaco', 'Courier New', monospace;<br \/>            font-size: 0.9rem;<br \/>            line-height: 1.5;<br \/>            position: relative;<br \/>        }<\/p>\n<p>        .code-block::before {<br \/>            content: 'PowerShell';<br \/>            position: absolute;<br \/>            top: 8px;<br \/>            right: 15px;<br \/>            background: #667eea;<br \/>            color: white;<br \/>            padding: 4px 12px;<br \/>            border-radius: 4px;<br \/>            font-size: 0.8rem;<br \/>            font-weight: 600;<br \/>        }<\/p>\n<p>        .code-block.json::before {<br \/>            content: 'JSON';<br \/>            background: #f39c12;<br \/>        }<\/p>\n<p>        .code-block.bash::before {<br \/>            content: 'Bash';<br \/>            background: #27ae60;<br \/>        }<\/p>\n<p>        .highlight {<br \/>            background: #fff3cd;<br \/>            padding: 20px;<br \/>            border-left: 5px solid #ffc107;<br \/>            border-radius: 0 8px 8px 0;<br \/>            margin: 20px 0;<br \/>        }<\/p>\n<p>        .warning {<br \/>            background: #f8d7da;<br \/>            padding: 20px;<br \/>            border-left: 5px solid #dc3545;<br \/>            border-radius: 0 8px 8px 0;<br \/>            margin: 20px 0;<br \/>        }<\/p>\n<p>        .info {<br \/>            background: #d1ecf1;<br \/>            padding: 20px;<br \/>            border-left: 5px solid #17a2b8;<br \/>            border-radius: 0 8px 8px 0;<br \/>            margin: 20px 0;<br \/>        }<\/p>\n<p>        .step-container {<br \/>            background: #f8f9fa;<br \/>            border-radius: 12px;<br \/>            padding: 30px;<br \/>            margin: 30px 0;<br \/>        }<\/p>\n<p>        .step {<br \/>            display: flex;<br \/>            align-items: flex-start;<br \/>            margin-bottom: 25px;<br \/>            padding-bottom: 25px;<br \/>            border-bottom: 1px solid #e9ecef;<br \/>        }<\/p>\n<p>        .step:last-child {<br \/>            border-bottom: none;<br \/>            margin-bottom: 0;<br \/>            padding-bottom: 0;<br \/>        }<\/p>\n<p>        .step-number {<br \/>            background: #667eea;<br \/>            color: white;<br \/>            width: 40px;<br \/>            height: 40px;<br \/>            border-radius: 50%;<br \/>            display: flex;<br \/>            align-items: center;<br \/>            justify-content: center;<br \/>            font-weight: bold;<br \/>            margin-right: 20px;<br \/>            flex-shrink: 0;<br \/>        }<\/p>\n<p>        .step-content h4 {<br \/>            margin-top: 0;<br \/>            color: #2c3e50;<br \/>        }<\/p>\n<p>        table {<br \/>            width: 100%;<br \/>            border-collapse: collapse;<br \/>            margin: 20px 0;<br \/>            background: white;<br \/>            border-radius: 8px;<br \/>            overflow: hidden;<br \/>            box-shadow: 0 2px 10px rgba(0,0,0,0.1);<br \/>        }<\/p>\n<p>        th, td {<br \/>            padding: 15px;<br \/>            text-align: left;<br \/>            border-bottom: 1px solid #e9ecef;<br \/>        }<\/p>\n<p>        th {<br \/>            background: #667eea;<br \/>            color: white;<br \/>            font-weight: 600;<br \/>        }<\/p>\n<p>        tr:hover {<br \/>            background: #f8f9fa;<br \/>        }<\/p>\n<p>        .toc {<br \/>            background: #f8f9fa;<br \/>            padding: 30px;<br \/>            border-radius: 12px;<br \/>            margin: 40px 0;<br \/>        }<\/p>\n<p>        .toc h3 {<br \/>            margin-top: 0;<br \/>            color: #2c3e50;<br \/>        }<\/p>\n<p>        .toc ul {<br \/>            list-style: none;<br \/>            padding-left: 0;<br \/>        }<\/p>\n<p>        .toc li {<br \/>            margin: 8px 0;<br \/>        }<\/p>\n<p>        .toc a {<br \/>            color: #667eea;<br \/>            text-decoration: none;<br \/>            padding: 5px 0;<br \/>            display: block;<br \/>            transition: color 0.3s ease;<br \/>        }<\/p>\n<p>        .toc a:hover {<br \/>            color: #5a6fd8;<br \/>            text-decoration: underline;<br \/>        }<\/p>\n<p>        .footer {<br \/>            background: #2c3e50;<br \/>            color: white;<br \/>            text-align: center;<br \/>            padding: 40px 0;<br \/>            margin-top: 60px;<br \/>        }<\/p>\n<p>        .footer a {<br \/>            color: #667eea;<br \/>            text-decoration: none;<br \/>        }<\/p>\n<p>        .footer a:hover {<br \/>            text-decoration: underline;<br \/>        }<\/p>\n<p>        @media (max-width: 768px) {<br \/>            .hero h1 {<br \/>                font-size: 2rem;<br \/>            }<\/p>\n<p>            .hero p {<br \/>                font-size: 1.1rem;<br \/>            }<\/p>\n<p>            .article-content {<br \/>                padding: 30px;<br \/>            }<\/p>\n<p>            .feature-grid {<br \/>                grid-template-columns: 1fr;<br \/>            }<\/p>\n<p>            h2 {<br \/>                font-size: 1.8rem;<br \/>            }<br \/>        }<br \/>    <\/style>\n<p>\u00a0<\/p>\n<div class=\"hero\">\n<div class=\"container\">\n<h1><\/h1>\n<p>A comprehensive PowerShell solution for migrating email aliases from on-premise Exchange to Exchange Online safely and efficiently.<\/p>\n<p><a class=\"download-btn\" href=\"https:\/\/github.com\/MSB365\/Mail-Alias-Migration\/tree\/main\" target=\"_blank\" rel=\"noopener\"><br \/>\nDownload Scripts from GitHub<br \/>\n<\/a><\/p>\n<\/div>\n<\/div>\n<div class=\"container\">\n<div class=\"content\">\n<div class=\"article-content\">\n<div class=\"toc\">\n<h3>Table of Contents<\/h3>\n<ul>\n<li><a href=\"#overview\">Overview & Features<\/a><\/li>\n<li><a href=\"#prerequisites\">Prerequisites<\/a><\/li>\n<li><a href=\"#installation\">Installation Guide<\/a><\/li>\n<li><a href=\"#quick-start\">Quick Start Guide<\/a><\/li>\n<li><a href=\"#export-script\">Export Script Details<\/a><\/li>\n<li><a href=\"#import-script\">Import Script Details<\/a><\/li>\n<li><a href=\"#examples\">Advanced Examples<\/a><\/li>\n<li><a href=\"#troubleshooting\">Troubleshooting<\/a><\/li>\n<li><a href=\"#best-practices\">Best Practices<\/a><\/li>\n<\/ul>\n<\/div>\n<section id=\"overview\">\n<h2>Overview<\/h2>\n<p>When migrating from on-premise Exchange to Exchange Online (Office 365), one of the most challenging aspects is preserving email aliases. Users often have multiple email addresses that need to be maintained for business continuity. This PowerShell solution provides a safe, automated way to export aliases from your on-premise environment and import them to Exchange Online.<\/p>\n<div class=\"feature-grid\">\n<div class=\"feature-card\">\n<h4>\u2705 Safe Operations<\/h4>\n<p>Scripts only add aliases, never remove existing ones. Your current Exchange Online configuration remains intact.<\/p>\n<\/div>\n<div class=\"feature-card\">\n<h4>Flexible Targeting<\/h4>\n<p>Target specific databases, organizational units, or use custom filters to scope your migration precisely.<\/p>\n<\/div>\n<div class=\"feature-card\">\n<h4>Preview Mode<\/h4>\n<p>WhatIf support lets you preview all changes before applying them, ensuring confidence in your migration.<\/p>\n<\/div>\n<div class=\"feature-card\">\n<h4>Progress Tracking<\/h4>\n<p>Real-time progress indicators and comprehensive logging help you monitor large migrations.<\/p>\n<\/div>\n<div class=\"feature-card\">\n<h4>Structured Export<\/h4>\n<p>JSON format provides easy review, backup, and audit trail of your migration data.<\/p>\n<\/div>\n<div class=\"feature-card\">\n<h4>Enterprise Ready<\/h4>\n<p>Built for production environments with error handling, retry logic, and detailed reporting.<\/p>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"prerequisites\">\n<h2>Prerequisites<\/h2>\n<h3>For On-Premise Exchange (Export)<\/h3>\n<ul>\n<li><strong>PowerShell 5.1 or later<\/strong> \u2013 Required for script execution<\/li>\n<li><strong>Exchange Management Shell<\/strong> \u2013 Or remote PowerShell access to Exchange server<\/li>\n<li><strong>Administrative Permissions<\/strong> \u2013 Organization Management or Recipient Management role<\/li>\n<li><strong>Network Access<\/strong> \u2013 Connectivity to Exchange server from script execution location<\/li>\n<\/ul>\n<h3>For Exchange Online (Import)<\/h3>\n<ul>\n<li><strong>PowerShell 5.1 or later<\/strong> \u2013 Required for script execution<\/li>\n<li><strong>ExchangeOnlineManagement Module<\/strong> \u2013 Microsoft\u2019s official PowerShell module<\/li>\n<li><strong>Exchange Online Admin Rights<\/strong> \u2013 Global Admin or Exchange Administrator role<\/li>\n<li><strong>Modern Authentication<\/strong> \u2013 Support for OAuth 2.0 and conditional access policies<\/li>\n<\/ul>\n<\/section>\n<section id=\"installation\">\n<h2>Installation Guide<\/h2>\n<div class=\"step-container\">\n<div class=\"step\">\n<div class=\"step-number\">1<\/div>\n<div class=\"step-content\">\n<h4>Install Exchange Online Management Module<\/h4>\n<p>This module is required for connecting to Exchange Online and managing mailboxes.<\/p>\n<div class=\"code-block\"># Install the module (run as Administrator)<br \/>\nInstall-Module -Name ExchangeOnlineManagement -Force -AllowClobber# Verify installation<br \/>\nGet-Module -ListAvailable -Name ExchangeOnlineManagement<\/div>\n<\/div>\n<\/div>\n<div class=\"step\">\n<div class=\"step-number\">2<\/div>\n<div class=\"step-content\">\n<h4>Download the Scripts<\/h4>\n<p>Get the latest version of both PowerShell scripts from the GitHub repository.<\/p>\n<div class=\"code-block bash\"># Clone the entire repository<br \/>\ngit clone https:\/\/github.com\/MSB365\/Mail-Alias-Migration.git<br \/>\ncd Mail-Alias-Migration# Or download individual files directly from GitHub<\/div>\n<p><strong>Direct Download Links:<\/strong><\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/MSB365\/Mail-Alias-Migration\/blob\/main\/Export-OnPremiseMailboxes.ps1\" target=\"_blank\" rel=\"noopener\">Export-OnPremiseMailboxes.ps1<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/MSB365\/Mail-Alias-Migration\/blob\/main\/Import-MailboxAliases.ps1\" target=\"_blank\" rel=\"noopener\">Import-MailboxAliases.ps1<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<div class=\"step\">\n<div class=\"step-number\">3<\/div>\n<div class=\"step-content\">\n<h4>Configure PowerShell Execution Policy<\/h4>\n<p>Allow the scripts to run by setting the appropriate execution policy.<\/p>\n<pre class=\"code-block\"># Set execution policy for current user\r\nSet-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser# Verify the setting\r\nGet-ExecutionPolicy -List<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"quick-start\">\n<h2>\u26a1 Quick Start Guide<\/h2>\n<div class=\"info\"><strong> Pro Tip:<\/strong> Always start with a small test group to validate the process before running large migrations.<\/div>\n<div class=\"step-container\">\n<div class=\"step\">\n<div class=\"step-number\">1<\/div>\n<div class=\"step-content\">\n<h4>Export from On-Premise Exchange<\/h4>\n<p>Run the export script on a machine with Exchange Management Shell access.<\/p>\n<div class=\"code-block\">\n<pre># Export all mailboxes from a specific database\r\n\r\n.\\Export-OnPremiseMailboxes.ps1 -Database \"Mailbox Database 01\"# Export with department filter\r\n\r\n.\\Export-OnPremiseMailboxes.ps1 -Filter \"Department -eq 'Sales'\"\r\n\r\n# Export from specific OU\r\n.\\Export-OnPremiseMailboxes.ps1 -OrganizationalUnit \"OU=Users,DC=contoso,DC=com\"<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"step\">\n<div class=\"step-number\">2<\/div>\n<div class=\"step-content\">\n<h4>Review the Export Data<\/h4>\n<p>Examine the generated JSON file to verify the export captured the expected data.<\/p>\n<pre class=\"code-block\"># Load and review export summary\r\n$data = Get-Content .\\mailbox-addresses.json | ConvertFrom-Json\r\nWrite-Host \"Exported $($data.Mailboxes.Count) mailboxes\"# View detailed information\r\n$data.Mailboxes | Format-Table DisplayName, PrimarySMTPAddress, @{Name=\"Aliases\";Expression={$_.EmailAliases.Count}}<\/pre>\n<\/div>\n<\/div>\n<div class=\"step\">\n<div class=\"step-number\">3<\/div>\n<div class=\"step-content\">\n<h4>Test Import (WhatIf Mode)<\/h4>\n<p>Preview what changes will be made without actually applying them.<\/p>\n<div class=\"code-block\"># Preview changes without applying them<br \/>\n.\\Import-MailboxAliases.ps1 -JsonPath .\\mailbox-addresses.json -WhatIf<\/div>\n<div class=\"highlight\"><strong>\u26a0\ufe0f Important:<\/strong> Always run in WhatIf mode first to verify the changes look correct before proceeding with the actual import.<\/div>\n<\/div>\n<\/div>\n<div class=\"step\">\n<div class=\"step-number\">4<\/div>\n<div class=\"step-content\">\n<h4>Perform the Import<\/h4>\n<p>Execute the actual import to add aliases to Exchange Online mailboxes.<\/p>\n<pre class=\"code-block\"># Import aliases to Exchange Online\r\n.\\Import-MailboxAliases.ps1 -JsonPath .\\mailbox-addresses.json<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section id=\"export-script\">\n<h2>Export Script: Export-OnPremiseMailboxes.ps1<\/h2>\n<p>This script connects to your on-premise Exchange server and exports mailbox information including primary SMTP addresses and all aliases to a structured JSON file.<\/p>\n<h3>Parameters<\/h3>\n<table>\n<thead>\n<tr>\n<th>Parameter<\/th>\n<th>Type<\/th>\n<th>Required<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>Server<\/code><\/td>\n<td>String<\/td>\n<td>No<\/td>\n<td>Exchange server FQDN (uses auto-discovery if not specified)<\/td>\n<\/tr>\n<tr>\n<td><code>Database<\/code><\/td>\n<td>String<\/td>\n<td>No<\/td>\n<td>Target specific mailbox database for scoped export<\/td>\n<\/tr>\n<tr>\n<td><code>OrganizationalUnit<\/code><\/td>\n<td>String<\/td>\n<td>No<\/td>\n<td>Target specific organizational unit (OU) path<\/td>\n<\/tr>\n<tr>\n<td><code>Filter<\/code><\/td>\n<td>String<\/td>\n<td>No<\/td>\n<td>Custom PowerShell filter expression for mailbox selection<\/td>\n<\/tr>\n<tr>\n<td><code>OutputPath<\/code><\/td>\n<td>String<\/td>\n<td>No<\/td>\n<td>JSON output file path (default: <code>.\\mailbox-addresses.json<\/code>)<\/td>\n<\/tr>\n<tr>\n<td><code>Credential<\/code><\/td>\n<td>PSCredential<\/td>\n<td>No<\/td>\n<td>Alternative credentials for Exchange connection<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Usage Examples<\/h3>\n<h4>Database-Specific Export<\/h4>\n<pre class=\"code-block\"># Export all mailboxes from a specific database\r\n.\\Export-OnPremiseMailboxes.ps1 -Database \"Executive Mailbox Database\"# Export with custom output location\r\n.\\Export-OnPremiseMailboxes.ps1 -Database \"Sales DB\" -OutputPath \"C:\\Migration\\sales-export.json\"<\/pre>\n<h4>Department-Based Export<\/h4>\n<pre class=\"code-block\"># Export Marketing department\r\n.\\Export-OnPremiseMailboxes.ps1 -Filter \"Department -eq 'Marketing'\"# Export multiple departments\r\n.\\Export-OnPremiseMailboxes.ps1 -Filter \"Department -eq 'Sales' -or Department -eq 'Marketing'\"<\/pre>\n<p># Export with location filter<br \/>\n.\\Export-OnPremiseMailboxes.ps1 -Filter \u201cDepartment -eq \u2018IT\u2019 -and Office -eq \u2018New York'\u201d<\/p>\n<h4>Organizational Unit Export<\/h4>\n<pre class=\"code-block\"># Export from specific OU\r\n.\\Export-OnPremiseMailboxes.ps1 -OrganizationalUnit \"OU=VIP,OU=Users,DC=company,DC=com\"# Export executives\r\n.\\Export-OnPremiseMailboxes.ps1 -OrganizationalUnit \"OU=Executives,DC=contoso,DC=com\"<\/pre>\n<h3>Common Filter Examples<\/h3>\n<pre class=\"code-block\"># Department-based filters\r\n-Filter \"Department -eq 'IT'\"\r\n-Filter \"Department -like '*Sales*'\"# Location-based filters\r\n-Filter \"Office -eq 'London'\"\r\n-Filter \"Office -ne 'Temporary'\"<\/pre>\n<p># Title-based filters<br \/>\n-Filter \u201cTitle -like \u2018*Manager*'\u201d<br \/>\n-Filter \u201cTitle -like \u2018*Director*\u2019 -or Title -like \u2018*VP*'\u201d<\/p>\n<p># Exclude test accounts<br \/>\n-Filter \u201cDisplayName -notlike \u2018Test*\u2019 -and DisplayName -notlike \u2018Demo*'\u201d<\/p>\n<p># Custom attribute filters<br \/>\n-Filter \u201cCustomAttribute1 -eq \u2018VIP'\u201d<br \/>\n-Filter \u201cCustomAttribute2 -ne \u2018Exclude'\u201d<\/p>\n<p># Complex combinations<br \/>\n-Filter \u201cDepartment -eq \u2018Sales\u2019 -and Office -eq \u2018NYC\u2019 -and Title -like \u2018*Manager*'\u201d<\/p>\n<\/section>\n<section id=\"import-script\">\n<h2>Import Script: Import-MailboxAliases.ps1<\/h2>\n<p>This script reads the JSON file created by the export script and safely adds the aliases to corresponding mailboxes in Exchange Online. It only adds aliases and never removes existing ones.<\/p>\n<h3>Parameters<\/h3>\n<table>\n<thead>\n<tr>\n<th>Parameter<\/th>\n<th>Type<\/th>\n<th>Required<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>JsonPath<\/code><\/td>\n<td>String<\/td>\n<td>Yes<\/td>\n<td>Path to JSON file created by export script<\/td>\n<\/tr>\n<tr>\n<td><code>WhatIf<\/code><\/td>\n<td>Switch<\/td>\n<td>No<\/td>\n<td>Preview changes without applying them<\/td>\n<\/tr>\n<tr>\n<td><code>Credential<\/code><\/td>\n<td>PSCredential<\/td>\n<td>No<\/td>\n<td>Exchange Online credentials (uses interactive auth if not provided)<\/td>\n<\/tr>\n<tr>\n<td><code>TenantId<\/code><\/td>\n<td>String<\/td>\n<td>No<\/td>\n<td>Azure AD Tenant ID for multi-tenant environments<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Usage Examples<\/h3>\n<h4>Basic Import Operations<\/h4>\n<pre class=\"code-block\"># Basic import\r\n.\\Import-MailboxAliases.ps1 -JsonPath .\\mailbox-addresses.json# Preview mode (recommended first step)\r\n.\\Import-MailboxAliases.ps1 -JsonPath .\\mailbox-addresses.json -WhatIf<\/pre>\n<p># Import with progress monitoring<br \/>\n.\\Import-MailboxAliases.ps1 -JsonPath .\\sales-export.json -Verbose<\/p>\n<h4>Multi-Tenant and Credential Scenarios<\/h4>\n<pre class=\"code-block\"># Specific tenant\r\n.\\Import-MailboxAliases.ps1 -JsonPath .\\export.json -TenantId \"12345678-1234-1234-1234-123456789012\"# With stored credentials\r\n$cred = Get-Credential -Message \"Enter Exchange Online Admin Credentials\"\r\n.\\Import-MailboxAliases.ps1 -JsonPath .\\export.json -Credential $cred<\/pre>\n<p># Service principal authentication<br \/>\n$appCred = New-Object System.Management.Automation.PSCredential(\u201capp-id\u201d, $secureSecret)<br \/>\n.\\Import-MailboxAliases.ps1 -JsonPath .\\export.json -Credential $appCred -TenantId \u201ctenant-id\u201d<\/p>\n<\/section>\n<section id=\"examples\">\n<h2>Advanced Usage Examples<\/h2>\n<h3>Example 1: Phased Department Migration<\/h3>\n<p>Migrate departments one at a time to minimize risk and allow for validation between phases.<\/p>\n<pre class=\"code-block\"># Phase 1: Sales Department\r\n.\\Export-OnPremiseMailboxes.ps1 -Filter \"Department -eq 'Sales'\" -OutputPath \".\\sales-phase1.json\"# Review sales data\r\n$salesData = Get-Content .\\sales-phase1.json | ConvertFrom-Json\r\nWrite-Host \"Sales users to migrate: $($salesData.Mailboxes.Count)\"\r\n$salesData.Mailboxes | Select DisplayName, PrimarySMTPAddress | Format-Table<\/pre>\n<p># Test import<br \/>\n.\\Import-MailboxAliases.ps1 -JsonPath .\\sales-phase1.json -WhatIf<\/p>\n<p># Execute import<br \/>\n.\\Import-MailboxAliases.ps1 -JsonPath .\\sales-phase1.json<\/p>\n<p># Phase 2: Marketing Department<br \/>\n.\\Export-OnPremiseMailboxes.ps1 -Filter \u201cDepartment -eq \u2018Marketing'\u201d -OutputPath \u201c.\\marketing-phase2.json\u201d<br \/>\n.\\Import-MailboxAliases.ps1 -JsonPath .\\marketing-phase2.json -WhatIf<br \/>\n.\\Import-MailboxAliases.ps1 -JsonPath .\\marketing-phase2.json<\/p>\n<p># Continue with additional departments\u2026<\/p>\n<h3>Example 2: VIP User Priority Migration<\/h3>\n<p>Prioritize executive and VIP users for early migration to ensure business continuity.<\/p>\n<div class=\"code-block\"># Export VIP users first<br \/>\n.\\Export-OnPremiseMailboxes.ps1 -Filter \u201cTitle -like \u2018*Director*\u2019 -or Title -like \u2018*VP*\u2019 -or Title -like \u2018*CEO*\u2019 -or Title -like \u2018*President*'\u201d -OutputPath \u201c.\\vip-users.json\u201d# Verify VIP list<br \/>\n$vipData = Get-Content .\\vip-users.json | ConvertFrom-Json<br \/>\nWrite-Host \u201cVIP users identified: $($vipData.Mailboxes.Count)\u201d<br \/>\n$vipData.Mailboxes | Select DisplayName, Title, PrimarySMTPAddress, @{Name=\u201dAliases\u201d;Expression={$_.EmailAliases.Count}} | Format-Table# Migrate VIP users with extra caution<br \/>\n.\\Import-MailboxAliases.ps1 -JsonPath .\\vip-users.json -WhatIf<br \/>\nRead-Host \u201cPress Enter to proceed with VIP migration\u201d<br \/>\n.\\Import-MailboxAliases.ps1 -JsonPath .\\vip-users.json<\/div>\n<h3>Example 3: Database-by-Database Migration<\/h3>\n<p>Process each mailbox database separately for better control and monitoring.<\/p>\n<pre class=\"code-block\"># Get list of all databases\r\n$databases = Get-MailboxDatabase | Select-Object Name, ServerWrite-Host \"Found $($databases.Count) mailbox databases:\"\r\n$databases | Format-Table<\/pre>\n<p>foreach ($db in $databases) {<br \/>\n$outputFile = \u201c.\\export-$($db.Name -replace \u2018 \u2018,\u2019-\u2018 -replace \u2018[^a-zA-Z0-9-]\u2019,\u201d).json\u201d<br \/>\nWrite-Host \u201cProcessing database: $($db.Name)\u201d -ForegroundColor Green<\/p>\n<p># Export database<br \/>\n.\\Export-OnPremiseMailboxes.ps1 -Database $db.Name -OutputPath $outputFile<\/p>\n<p># Review export<br \/>\n$dbData = Get-Content $outputFile | ConvertFrom-Json<br \/>\nWrite-Host \u201d Exported $($dbData.Mailboxes.Count) mailboxes\u201d<\/p>\n<p># Test import<br \/>\nWrite-Host \u201d Testing import\u2026\u201d -ForegroundColor Yellow<br \/>\n.\\Import-MailboxAliases.ps1 -JsonPath $outputFile -WhatIf<\/p>\n<p># Prompt for confirmation<br \/>\n$confirm = Read-Host \u201d Proceed with import for $($db.Name)? (Y\/N)\u201d<br \/>\nif ($confirm -eq \u2018Y\u2019 -or $confirm -eq \u2018y\u2019) {<br \/>\nWrite-Host \u201d Importing aliases\u2026\u201d -ForegroundColor Green<br \/>\n.\\Import-MailboxAliases.ps1 -JsonPath $outputFile<br \/>\nWrite-Host \u201d Completed: $($db.Name)\u201d -ForegroundColor Green<br \/>\n} else {<br \/>\nWrite-Host \u201d Skipped: $($db.Name)\u201d -ForegroundColor Yellow<br \/>\n}<\/p>\n<p>Write-Host \u201c\u201d<br \/>\n}<\/p>\n<h3>Example 4: Selective Alias Migration<\/h3>\n<p>Filter and migrate only mailboxes that have aliases, reducing processing time.<\/p>\n<pre class=\"code-block\"># Export all mailboxes\r\n.\\Export-OnPremiseMailboxes.ps1 -OutputPath \".\\all-mailboxes.json\"# Filter to only include mailboxes with aliases\r\n$allData = Get-Content .\\all-mailboxes.json | ConvertFrom-Json\r\n$filteredMailboxes = $allData.Mailboxes | Where-Object { $_.EmailAliases.Count -gt 0 }<\/pre>\n<p>Write-Host \u201cOriginal mailboxes: $($allData.Mailboxes.Count)\u201d<br \/>\nWrite-Host \u201cMailboxes with aliases: $($filteredMailboxes.Count)\u201d<\/p>\n<p># Create filtered export<br \/>\n$filteredData = @{<br \/>\nExportInfo = $allData.ExportInfo<br \/>\nMailboxes = $filteredMailboxes<br \/>\n}<br \/>\n$filteredData.ExportInfo.TotalMailboxes = $filteredMailboxes.Count<br \/>\n$filteredData.ExportInfo.Filter = \u201cMailboxes with aliases only\u201d<\/p>\n<p>$filteredData | ConvertTo-Json -Depth 10 | Out-File .\\filtered-mailboxes.json<\/p>\n<p># Import filtered data<br \/>\n.\\Import-MailboxAliases.ps1 -JsonPath .\\filtered-mailboxes.json -WhatIf<br \/>\n.\\Import-MailboxAliases.ps1 -JsonPath .\\filtered-mailboxes.json<\/p>\n<\/section>\n<section id=\"troubleshooting\">\n<h2>Troubleshooting Guide<\/h2>\n<h3>Exchange Connection Issues<\/h3>\n<div class=\"warning\"><strong>Symptoms:<\/strong> \u201cCannot connect to Exchange server\u201d, \u201cAccess denied\u201d errors, connection timeouts<\/div>\n<h4>Solutions:<\/h4>\n<pre class=\"code-block\"># Test basic connectivity\r\nTest-NetConnection -ComputerName \"your-exchange-server.domain.com\" -Port 80\r\nTest-NetConnection -ComputerName \"your-exchange-server.domain.com\" -Port 443# Verify Exchange Management Shell\r\nGet-PSSession | Where-Object {$_.ConfigurationName -eq \"Microsoft.Exchange\"}<\/pre>\n<p># Test Exchange cmdlets<br \/>\nGet-ExchangeServer<br \/>\nGet-MailboxDatabase | Select Name, Server<\/p>\n<p># Try explicit server connection<br \/>\n.\\Export-OnPremiseMailboxes.ps1 -Server \u201cEXCH01.contoso.com\u201d<\/p>\n<p># Use alternative credentials<br \/>\n$cred = Get-Credential -Message \u201cEnter Exchange Admin Credentials\u201d<br \/>\n.\\Export-OnPremiseMailboxes.ps1 -Credential $cred<\/p>\n<h3>Exchange Online Module Issues<\/h3>\n<div class=\"warning\"><strong>Symptoms:<\/strong> \u201cExchangeOnlineManagement module not found\u201d, authentication failures, MFA-related errors<\/div>\n<h4>Solutions:<\/h4>\n<pre class=\"code-block\"># Check current module version\r\nGet-Module -ListAvailable -Name ExchangeOnlineManagement# Uninstall and reinstall module\r\nUninstall-Module -Name ExchangeOnlineManagement -Force -AllVersions\r\nInstall-Module -Name ExchangeOnlineManagement -Force -AllowClobber<\/pre>\n<p># Clear cached credentials<br \/>\nDisconnect-ExchangeOnline -Confirm:$false<\/p>\n<p># Manual connection test<br \/>\nConnect-ExchangeOnline -ShowProgress $true<\/p>\n<p># Check for multiple versions<br \/>\nGet-Module -ListAvailable -Name ExchangeOnlineManagement | Format-Table Name, Version, Path<\/p>\n<h3>Mailbox Matching Problems<\/h3>\n<div class=\"warning\"><strong>Symptoms:<\/strong> \u201cMailbox not found in Exchange Online\u201d, many mailboxes skipped during import, primary SMTP address mismatches<\/div>\n<h4>Solutions:<\/h4>\n<pre class=\"code-block\"># Verify mailbox exists with different address format\r\nGet-Mailbox -Identity \"user@domain.com\" -ErrorAction SilentlyContinue# Check accepted domains in Exchange Online\r\nGet-AcceptedDomain | Format-Table Name, DomainName, DomainType<\/pre>\n<p># List sample mailboxes for comparison<br \/>\nGet-Mailbox -ResultSize 10 | Select DisplayName, PrimarySmtpAddress, EmailAddresses<\/p>\n<p># Check for address policy differences<br \/>\nGet-EmailAddressPolicy | Format-Table Name, EnabledEmailAddressTemplates<\/p>\n<p># Verify domain routing<br \/>\nGet-RemoteDomain | Format-Table DomainName, IsInternal<\/p>\n<h3>Permission and Access Issues<\/h3>\n<div class=\"warning\"><strong>Symptoms:<\/strong> \u201cInsufficient permissions\u201d errors, \u201cAccess denied\u201d during import, partial data exports<\/div>\n<h4>Solutions:<\/h4>\n<pre class=\"code-block\"># Check current user permissions in Exchange Online\r\nGet-RoleGroupMember \"Organization Management\" | Where-Object {$_.Name -like \"*$env:USERNAME*\"}# Verify Exchange Online admin roles\r\nGet-MsolRole | Where-Object {$_.Name -like \"*Exchange*\"}\r\nGet-MsolRoleMember -RoleObjectId (Get-MsolRole -RoleName \"Exchange Service Administrator\").ObjectId<\/pre>\n<p># Test with Global Admin account<br \/>\n$globalAdminCred = Get-Credential -Message \u201cEnter Global Admin Credentials\u201d<br \/>\n.\\Import-MailboxAliases.ps1 -JsonPath .\\export.json -Credential $globalAdminCred<\/p>\n<p># Check on-premise Exchange permissions<br \/>\nGet-ManagementRoleAssignment -RoleAssignee $env:USERNAME | Select Role, RoleAssigneeName<\/p>\n<h3>Performance and Scale Issues<\/h3>\n<div class=\"warning\"><strong>Symptoms:<\/strong> Script timeouts with large exports, memory issues, slow processing, throttling errors<\/div>\n<h4>Solutions:<\/h4>\n<div class=\"code-block\">\n<pre># Process in smaller batches\r\n$databases = Get-MailboxDatabase\r\nforeach ($db in $databases) {\r\n.\\Export-OnPremiseMailboxes.ps1 -Database $db.Name -OutputPath \".\\batch-$($db.Name -replace ' ','-').json\"\r\n}# Use more specific filters to reduce dataset size\r\n.\\Export-OnPremiseMailboxes.ps1 -Filter \"Department -eq 'Sales' -and Office -eq 'NYC'\"\r\n\r\n# Monitor memory usage during execution\r\nGet-Process PowerShell | Select ProcessName, WorkingSet, VirtualMemorySize\r\n\r\n# Check for Exchange Online throttling\r\n# Look for \"Request was throttled\" messages in output\r\n\r\n# Implement delays between operations\r\nStart-Sleep -Seconds 2 # Add between batches<\/pre>\n<\/div>\n<h3>JSON File Issues<\/h3>\n<div class=\"warning\"><strong>Symptoms:<\/strong> \u201cInvalid JSON format\u201d, \u201cCannot parse JSON file\u201d, encoding issues<\/div>\n<h4>Solutions:<\/h4>\n<div class=\"code-block\">\n<pre># Validate JSON file structure\r\n\r\ntry {\r\n$testData = Get-Content .\\mailbox-addresses.json | ConvertFrom-Json\r\nWrite-Host \"JSON file is valid. Contains $($testData.Mailboxes.Count) mailboxes.\"\r\n} catch {\r\nWrite-Error \"JSON file is invalid: $($_.Exception.Message)\"\r\n}# Check file encoding\r\nGet-Content .\\mailbox-addresses.json -Encoding UTF8 | Select-Object -First 5\r\n# Repair JSON file if needed\r\n$content = Get-Content .\\mailbox-addresses.json -Raw\r\n$content = $content -replace '[^\\x20-\\x7E\\x0A\\x0D]', '' # Remove non-printable characters\r\n$content | Out-File .\\mailbox-addresses-fixed.json -Encoding UTF8\r\n\r\n# Verify file size and structure\r\nGet-ChildItem .\\mailbox-addresses.json | Select Name, Length<\/pre>\n<\/div>\n<\/section>\n<section id=\"best-practices\">\n<h2>Best Practices<\/h2>\n<h3>Pre-Migration Planning<\/h3>\n<div class=\"feature-grid\">\n<div class=\"feature-card\">\n<h4>Environment Assessment<\/h4>\n<ul>\n<li>Document current Exchange topology<\/li>\n<li>Identify all accepted domains<\/li>\n<li>Map organizational units and databases<\/li>\n<li>Review existing alias patterns<\/li>\n<li>Identify VIP users and critical mailboxes<\/li>\n<\/ul>\n<\/div>\n<div class=\"feature-card\">\n<h4>Pilot Testing<\/h4>\n<ul>\n<li>Start with 5-10 test users<\/li>\n<li>Test different mailbox types (regular, shared, distribution)<\/li>\n<li>Verify alias functionality after migration<\/li>\n<li>Document any issues encountered<\/li>\n<li>Validate email delivery to migrated aliases<\/li>\n<\/ul>\n<\/div>\n<div class=\"feature-card\">\n<h4>Backup Strategy<\/h4>\n<ul>\n<li>Export all mailbox data before starting<\/li>\n<li>Keep multiple copies of JSON files<\/li>\n<li>Document current Exchange Online configuration<\/li>\n<li>Plan rollback procedures<\/li>\n<li>Archive migration logs and reports<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<h3>Migration Execution<\/h3>\n<div class=\"step-container\">\n<div class=\"step\">\n<div class=\"step-number\">1<\/div>\n<div class=\"step-content\">\n<h4>Phased Approach<\/h4>\n<ul>\n<li>Migrate by department or business unit<\/li>\n<li>Process VIP users first<\/li>\n<li>Allow time between phases for validation<\/li>\n<li>Monitor Exchange Online service health<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<div class=\"step\">\n<div class=\"step-number\">2<\/div>\n<div class=\"step-content\">\n<h4>Monitoring and Validation<\/h4>\n<ul>\n<li>Use WhatIf mode extensively<\/li>\n<li>Spot-check migrated aliases<\/li>\n<li>Test email delivery to new aliases<\/li>\n<li>Monitor for any delivery issues<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<div class=\"step\">\n<div class=\"step-number\">3<\/div>\n<div class=\"step-content\">\n<h4>Communication<\/h4>\n<ul>\n<li>Notify users of migration schedule<\/li>\n<li>Provide timeline for alias availability<\/li>\n<li>Document any temporary limitations<\/li>\n<li>Establish support procedures<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<h3>Security Considerations<\/h3>\n<div class=\"info\">\n<p><strong> Security Best Practices:<\/strong><\/p>\n<ul>\n<li><strong>Credential Management:<\/strong> Use secure credential storage, implement least-privilege access<\/li>\n<li><strong>Data Protection:<\/strong> Encrypt JSON files, limit access to migration files, use secure transfer methods<\/li>\n<li><strong>Audit and Compliance:<\/strong> Log all activities, maintain audit trails, ensure regulatory compliance<\/li>\n<li><strong>Access Control:<\/strong> Limit script access to authorized personnel, monitor admin account usage<\/li>\n<\/ul>\n<\/div>\n<h3>Performance Optimization<\/h3>\n<pre class=\"code-block\"># Optimize for large environments\r\n# 1. Use specific filters to reduce dataset size\r\n.\\Export-OnPremiseMailboxes.ps1 -Filter \"Department -eq 'Sales'\" -OutputPath \".\\sales-only.json\"# 2. Process during off-peak hours\r\n$currentHour = (Get-Date).Hour\r\nif ($currentHour -lt 6 -or $currentHour -gt 22) {\r\nWrite-Host \"Running during off-peak hours\" -ForegroundColor Green\r\n# Run migration\r\n} else {\r\nWrite-Warning \"Consider running during off-peak hours (10 PM - 6 AM)\"\r\n}<\/pre>\n<p># 3. Implement batch processing with delays<br \/>\n$batchSize = 50<br \/>\n$mailboxes = $data.Mailboxes<br \/>\nfor ($i = 0; $i -lt $mailboxes.Count; $i += $batchSize) {<br \/>\n$batch = $mailboxes[$i..($i + $batchSize \u2013 1)]<br \/>\n# Process batch<br \/>\nStart-Sleep -Seconds 30 # Delay between batches<br \/>\n}<\/p>\n<p># 4. Monitor throttling and adjust accordingly<br \/>\n# Watch for \u201cRequest was throttled\u201d messages and increase delays<\/p>\n<\/section>\n<div class=\"highlight\">\n<h3>Key Takeaways<\/h3>\n<ul>\n<li><strong>Always test first:<\/strong> Use WhatIf mode and start with small pilot groups<\/li>\n<li><strong>Plan in phases:<\/strong> Don\u2019t migrate everything at once \u2013 use a phased approach<\/li>\n<li><strong>Monitor closely:<\/strong> Watch for errors, throttling, and delivery issues<\/li>\n<li><strong>Keep backups:<\/strong> Maintain copies of all export files and migration logs<\/li>\n<li><strong>Validate results:<\/strong> Test email delivery to migrated aliases<\/li>\n<\/ul>\n<\/div>\n<div class=\"warning\">\n<h3>\u26a0\ufe0f Important Disclaimers<\/h3>\n<ul>\n<li><strong>Testing Required:<\/strong> Always test in a non-production environment first<\/li>\n<li><strong>Additive Only:<\/strong> These scripts only ADD aliases, they never remove existing ones<\/li>\n<li><strong>Backup Essential:<\/strong> Keep backups of JSON export files and current configurations<\/li>\n<li><strong>Service Limits:<\/strong> Monitor Exchange Online throttling and service limits<\/li>\n<li><strong>Community Support:<\/strong> This is a community-supported project, not an official Microsoft tool<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"vlp-link-container vlp-layout-basic\"><a href=\"https:\/\/github.com\/MSB365\/Mail-Alias-Migration\/tree\/main\" class=\"vlp-link\" title=\"GitHub - MSB365\/Mail-Alias-Migration\" rel=\"nofollow\" target=\"_blank\"><\/a><div class=\"vlp-layout-zone-side\"><div class=\"vlp-block-2 vlp-link-image\"><img decoding=\"async\" src=\"https:\/\/opengraph.githubassets.com\/eaf8c8e8652a7a202ec0747afb7cadc7671f6c1a711da099fc273435fcf0e70d\/MSB365\/Mail-Alias-Migration\" style=\"max-width: 150px; max-height: 150px\" \/><\/div><\/div><div class=\"vlp-layout-zone-main\"><div class=\"vlp-block-0 vlp-link-title\">GitHub - MSB365\/Mail-Alias-Migration<\/div><div class=\"vlp-block-1 vlp-link-summary\">Contribute to MSB365\/Mail-Alias-Migration development by creating an account on GitHub.<\/div><\/div><\/div>\n<p>\u00a0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00a0 A comprehensive PowerShell solution for migrating email aliases from on-premise Exchange to Exchange Online safely and efficiently. Download Scripts from GitHub Table of Contents Overview &#038; Features Prerequisites Installation Guide Quick Start Guide Export Script Details Import Script Details Advanced Examples Troubleshooting Best Practices Overview When migrating from on-premise Exchange to Exchange Online (Office [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":6008,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[2,3],"tags":[],"class_list":["post-6005","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-exchange","category-powershell"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.msb365.blog\/index.php?rest_route=\/wp\/v2\/posts\/6005","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.msb365.blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.msb365.blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.msb365.blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.msb365.blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6005"}],"version-history":[{"count":4,"href":"https:\/\/www.msb365.blog\/index.php?rest_route=\/wp\/v2\/posts\/6005\/revisions"}],"predecessor-version":[{"id":6010,"href":"https:\/\/www.msb365.blog\/index.php?rest_route=\/wp\/v2\/posts\/6005\/revisions\/6010"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.msb365.blog\/index.php?rest_route=\/wp\/v2\/media\/6008"}],"wp:attachment":[{"href":"https:\/\/www.msb365.blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6005"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.msb365.blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6005"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.msb365.blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6005"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}