ऐडवांस माइग्रेशन के लिए Microsoft Azure सेट अप करना

Exchange Online (Microsoft 365) से अपने Google Workspace खाते में डेटा को सुरक्षित तरीके से माइग्रेट करने के लिए, Azure पोर्टल में Microsoft Azure ऐप्लिकेशन बनाने के लिए यह तरीका अपनाएं. आपके पास इनमें से कोई एक तरीका चुनने का विकल्प होता है:

अपने-आप कनेक्ट होने की सुविधा सेट अप करने के लिए, PowerShell स्क्रिप्ट का इस्तेमाल करना

इन चरणों को पूरा करने के लिए, आपके पास ग्लोबल या खास भूमिका वाले एडमिन का ऐक्सेस होना चाहिए.

शुरू करने से पहले: आपको Install-Module Microsoft.Graph -Scope CurrentUser इंस्टॉल करना होगा.

पहला विकल्प: Azure Cloud Shell का इस्तेमाल करना

  1. एडमिन के तौर पर, Microsoft Azure पोर्टल में साइन इन करें.
  2. Cloud Shellइसके बादPowershell पर क्लिक करें.
  3. अगर कहा जाए, तो स्टोरेज खाता बनाएं और डिफ़ॉल्ट सेटिंग स्वीकार करें.
  4. Install-Module Microsoft.Graph -Scope CurrentUser कमांड डालें और Enter पर क्लिक करें.
  5. अगर आपको किसी ऐसी रिपॉज़िटरी से इंस्टॉल करने का अनुरोध दिखता है जिस पर भरोसा नहीं किया जा सकता, तो Y टाइप करें. इसके बाद, Enter पर क्लिक करें.
  6. यहां दिए गए कोड ब्लॉक को कॉपी करें और PowerShell में चिपकाएं. इसके बाद, Enter पर क्लिक करें.
        <#
        .SYNOPSIS
        Automates the creation of a Single-Tenant Entra ID App for Workspace Migration.
        Strictly forces account selection and verifies specific Admin roles.
        #>
    
        # Check if the module is missing
        if (-not (Get-Module -ListAvailable -Name Microsoft.Graph.Authentication)) {
        Write-Host "Microsoft Graph module is NOT installed." -ForegroundColor Yellow
        $UserResponse = Read-Host "Would you like to try installing Microsoft Graph? (Y/N)"
    
        if ($UserResponse -ieq "Y") {
            try {
                # Use only native cmdlets, no .NET property setting
                Install-Module -Name Microsoft.Graph -Scope CurrentUser -Force -AllowClobber
                Write-Host "Installation complete!" -ForegroundColor Green
            }
            catch {
                Write-Error "Policy is blocking installation. Please contact IT to install Microsoft.Graph module."
                Read-Host "Press Enter to exit"; exit
            }
        }
        else {
            exit
        }
        } else {
        Write-Host "Microsoft Graph modules detected. Proceeding..." -ForegroundColor Green
        }
    
        # --- STEP 0: THE "DEEP" LOGOUT ---
        Write-Host "Forcing session cleanup..." -ForegroundColor Gray
        Disconnect-MgGraph -ErrorAction SilentlyContinue
    
        # Force clear the local token cache folder if it exists
        $CachePath = "$env:USERPROFILE\.mg"
        if (Test-Path $CachePath) {
        try { Remove-Item $CachePath -Recurse -Force -ErrorAction SilentlyContinue } catch {}
        }
    
        Write-Host "Opening Microsoft Login... (Please select the correct account)" -ForegroundColor Cyan
    
        $RequiredScopes = @(
        "Application.ReadWrite.All", 
        "AppRoleAssignment.ReadWrite.All", 
        "Directory.Read.All", 
        "RoleManagement.Read.Directory"
        )
    
        try {
        # In v2, -ContextScope Process is the most reliable way to force account selection
        # and prevent the session from saving to the machine permanently.
        Connect-MgGraph -Scopes $RequiredScopes -ContextScope Process
    
         $Context = Get-MgContext
        if ($null -eq $Context) { throw "Login was cancelled or failed." }
    
        $UserPrincipal = $Context.Account
        Write-Host "Logged in as: $UserPrincipal" -ForegroundColor Green
    
        # --- ROLE VALIDATION ---
        Write-Host "Verifying Directory Roles..." -ForegroundColor Gray
        $UserRoles = Get-MgUserMemberOf -UserId $Context.Account -All | Where-Object { $_.AdditionalProperties.displayName -ne $null }
        
        $Authorized = $false
        $RequiredRoles = @("Global Administrator", "Privileged Role Administrator")
    
        foreach ($role in $UserRoles) {
            $roleName = $role.AdditionalProperties.displayName
            if ($roleName -in $RequiredRoles) {
                $Authorized = $true
                Write-Host "Access Granted: $roleName" -ForegroundColor Green
                break
            }
        }
    
        if (-not $Authorized) {
            Write-Host "`nCRITICAL ERROR: Insufficient Privileges." -ForegroundColor Red
    
         Write-Host "Account must be 'Global Administrator' or 'Privileged Role Administrator'." -ForegroundColor Yellow
            Disconnect-MgGraph
            Read-Host "`nPress Enter to exit"; exit
        }
    
        } catch {
        Write-Error "Login failed: $_"
        Read-Host "Press Enter to exit"; exit
        }
    
        # --- USER INPUT ---
        Write-Host "`n--- APPLICATION SETUP ---" -ForegroundColor Cyan
        $InputName = Read-Host "Enter the name for your new Entra ID Application (Default: Workspace Migration App)"
        $AppName = if ([string]::IsNullOrWhiteSpace($InputName)) { "Workspace Migration App" } else { $InputName }
    
        # --- CONFIGURATION ---
        $PermissionMap = @{
        "calendar.read"  = "Calendars.Read"     
        "mail.read"      = "Mail.Read"
        "contacts.read"  = "Contacts.Read"
        "directory.read" = "Directory.Read.All"
        }
    
        $TenantId = $Context.TenantId
        $GraphAppId = "00000003-0000-0000-c000-000000000000"
    
        try {
        # --- STEP 1: REGISTER APPLICATION ---
        Write-Host "Creating Application: $AppName..." -ForegroundColor Cyan
        $Application = New-MgApplication -BodyParameter @{
            displayName = $AppName
            signInAudience = "AzureADMyOrg"
        }
        
        # --- STEP 2: PREPARE SERVICE PRINCIPAL ---
        $NewServicePrincipal = New-MgServicePrincipal -BodyParameter @{ appId = $Application.AppId }
    
        Write-Host "Waiting 10 seconds for replication..." -ForegroundColor DarkGray
        Start-Sleep -Seconds 10
    
        # --- STEP 3: CONFIGURE & GRANT PERMISSIONS ---
        Write-Host "Configuring API Permissions & Granting Admin Consent..." -ForegroundColor Cyan
        $GraphSP = Get-MgServicePrincipal -Filter "AppId eq '$GraphAppId'" | Select-Object -First 1
        
        $ResourceAccessList = @()
    
        foreach ($key in $PermissionMap.Keys) {
            $RealRoleName = $PermissionMap[$key]
            $Role = $GraphSP.AppRoles | Where-Object { $_.Value -eq $RealRoleName }
    
            if ($Role) {
                $ResourceAccessList += @{ id = $Role.Id; type = "Role" }
    
                New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $NewServicePrincipal.Id -BodyParameter @{
                    principalId = $NewServicePrincipal.Id
                    resourceId  = $GraphSP.Id
                    appRoleId   = $Role.Id
                } | Out-Null
                Write-Host " - Granted: $RealRoleName" -ForegroundColor Gray
            }
        }
    
        Update-MgApplication -ApplicationId $Application.Id -RequiredResourceAccess @(@{
            resourceAppId  = $GraphAppId
            resourceAccess = $ResourceAccessList
        })
    
        # --- STEP 4: CREATE CLIENT SECRET ---
        Write-Host "Generating Client Secret..." -ForegroundColor Cyan
        $ExpiryDate = (Get-Date).AddYears(2).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
        $PasswordCred = Add-MgApplicationPassword -ApplicationId $Application.Id -BodyParameter @{
            passwordCredential = @{
                displayName = "MigrationToolSecret"
                endDateTime = $ExpiryDate
            }
        }
    
        # --- OUTPUT ---
        Write-Host "`n-------------------------------------------------------" -ForegroundColor Yellow
        Write-Host "        SETUP COMPLETE - SAVE THESE DETAILS" -ForegroundColor Yellow
        Write-Host "-------------------------------------------------------" -ForegroundColor Yellow
        Write-Host "Application Name        : $AppName"
        Write-Host "Application (Client) ID : $($Application.AppId)"
        Write-Host "Client Secret Value     : $($PasswordCred.SecretText)"
        Write-Host "Directory (Tenant) ID   : $TenantId"
        Write-Warning "IMPORTANT: Copy the Client Secret Value immediately."
    
        }
        catch {
        Write-Error "Operation failed: $_"
        }
    
        # --- FINAL DISCONNECT ---
        Disconnect-MgGraph
        Read-Host "`nPress Enter to close this window"
        
  7. इन क्रेडेंशियल को नोट करें और इन्हें सुरक्षित तरीके से स्टोर करें. अगर क्रेडेंशियल लीक हो जाते हैं, तो हैकर आपके Exchange Online के पूरे डेटा को ऐक्सेस कर सकते हैं.
    • क्लाइंट सीक्रेट
    • ऐप्लिकेशन (क्लाइंट) का आईडी
    • डायरेक्ट्री (किरायेदार) का आईडी

दूसरा विकल्प: Windows PowerShell का इस्तेमाल करना

  1. Windows में, migration_app_creator.ps1 नाम की एक नई टेक्स्ट फ़ाइल बनाएं.
  2. नीचे दिए गए कोड ब्लॉक को कॉपी करें और इसे नई फ़ाइल में चिपकाएं. इसके बाद, Powershell के साथ चलाएं पर क्लिक करें.
  3.     <#
        .SYNOPSIS
        Automates the creation of a Single-Tenant Entra ID App for Workspace Migration.
        Strictly forces account selection and verifies specific Admin roles.
        #>
    
        # Check if the module is missing
        if (-not (Get-Module -ListAvailable -Name Microsoft.Graph.Authentication)) {
        Write-Host "Microsoft Graph module is NOT installed." -ForegroundColor Yellow
        $UserResponse = Read-Host "Would you like to try installing Microsoft Graph? (Y/N)"
    
        if ($UserResponse -ieq "Y") {
            try {
                # Use only native cmdlets, no .NET property setting
                Install-Module -Name Microsoft.Graph -Scope CurrentUser -Force -AllowClobber
                Write-Host "Installation complete!" -ForegroundColor Green
            }
            catch {
                Write-Error "Policy is blocking installation. Please contact IT to install Microsoft.Graph module."
                Read-Host "Press Enter to exit"; exit
            }
        }
        else {
            exit
        }
        } else {
        Write-Host "Microsoft Graph modules detected. Proceeding..." -ForegroundColor Green
        }
    
        # --- STEP 0: THE "DEEP" LOGOUT ---
        Write-Host "Forcing session cleanup..." -ForegroundColor Gray
        Disconnect-MgGraph -ErrorAction SilentlyContinue
    
        # Force clear the local token cache folder if it exists
        $CachePath = "$env:USERPROFILE\.mg"
        if (Test-Path $CachePath) {
        try { Remove-Item $CachePath -Recurse -Force -ErrorAction SilentlyContinue } catch {}
        }
    
        Write-Host "Opening Microsoft Login... (Please select the correct account)" -ForegroundColor Cyan
    
        $RequiredScopes = @(
        "Application.ReadWrite.All", 
        "AppRoleAssignment.ReadWrite.All", 
        "Directory.Read.All", 
        "RoleManagement.Read.Directory"
        )
    
        try {
        # In v2, -ContextScope Process is the most reliable way to force account selection
        # and prevent the session from saving to the machine permanently.
        Connect-MgGraph -Scopes $RequiredScopes -ContextScope Process
    
         $Context = Get-MgContext
        if ($null -eq $Context) { throw "Login was cancelled or failed." }
    
        $UserPrincipal = $Context.Account
        Write-Host "Logged in as: $UserPrincipal" -ForegroundColor Green
    
        # --- ROLE VALIDATION ---
        Write-Host "Verifying Directory Roles..." -ForegroundColor Gray
        $UserRoles = Get-MgUserMemberOf -UserId $Context.Account -All | Where-Object { $_.AdditionalProperties.displayName -ne $null }
        
        $Authorized = $false
        $RequiredRoles = @("Global Administrator", "Privileged Role Administrator")
    
        foreach ($role in $UserRoles) {
            $roleName = $role.AdditionalProperties.displayName
            if ($roleName -in $RequiredRoles) {
                $Authorized = $true
                Write-Host "Access Granted: $roleName" -ForegroundColor Green
                break
            }
        }
    
        if (-not $Authorized) {
            Write-Host "`nCRITICAL ERROR: Insufficient Privileges." -ForegroundColor Red
    
         Write-Host "Account must be 'Global Administrator' or 'Privileged Role Administrator'." -ForegroundColor Yellow
            Disconnect-MgGraph
            Read-Host "`nPress Enter to exit"; exit
        }
    
        } catch {
        Write-Error "Login failed: $_"
        Read-Host "Press Enter to exit"; exit
        }
    
        # --- USER INPUT ---
        Write-Host "`n--- APPLICATION SETUP ---" -ForegroundColor Cyan
        $InputName = Read-Host "Enter the name for your new Entra ID Application (Default: Workspace Migration App)"
        $AppName = if ([string]::IsNullOrWhiteSpace($InputName)) { "Workspace Migration App" } else { $InputName }
    
        # --- CONFIGURATION ---
        $PermissionMap = @{
        "calendar.read"  = "Calendars.Read"     
        "mail.read"      = "Mail.Read"
        "contacts.read"  = "Contacts.Read"
        "directory.read" = "Directory.Read.All"
        }
    
        $TenantId = $Context.TenantId
        $GraphAppId = "00000003-0000-0000-c000-000000000000"
    
        try {
        # --- STEP 1: REGISTER APPLICATION ---
        Write-Host "Creating Application: $AppName..." -ForegroundColor Cyan
        $Application = New-MgApplication -BodyParameter @{
            displayName = $AppName
            signInAudience = "AzureADMyOrg"
        }
        
        # --- STEP 2: PREPARE SERVICE PRINCIPAL ---
        $NewServicePrincipal = New-MgServicePrincipal -BodyParameter @{ appId = $Application.AppId }
    
        Write-Host "Waiting 10 seconds for replication..." -ForegroundColor DarkGray
        Start-Sleep -Seconds 10
    
        # --- STEP 3: CONFIGURE & GRANT PERMISSIONS ---
        Write-Host "Configuring API Permissions & Granting Admin Consent..." -ForegroundColor Cyan
        $GraphSP = Get-MgServicePrincipal -Filter "AppId eq '$GraphAppId'" | Select-Object -First 1
        
        $ResourceAccessList = @()
    
        foreach ($key in $PermissionMap.Keys) {
            $RealRoleName = $PermissionMap[$key]
            $Role = $GraphSP.AppRoles | Where-Object { $_.Value -eq $RealRoleName }
    
            if ($Role) {
                $ResourceAccessList += @{ id = $Role.Id; type = "Role" }
    
                New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $NewServicePrincipal.Id -BodyParameter @{
                    principalId = $NewServicePrincipal.Id
                    resourceId  = $GraphSP.Id
                    appRoleId   = $Role.Id
                } | Out-Null
                Write-Host " - Granted: $RealRoleName" -ForegroundColor Gray
            }
        }
    
        Update-MgApplication -ApplicationId $Application.Id -RequiredResourceAccess @(@{
            resourceAppId  = $GraphAppId
            resourceAccess = $ResourceAccessList
        })
    
        # --- STEP 4: CREATE CLIENT SECRET ---
        Write-Host "Generating Client Secret..." -ForegroundColor Cyan
        $ExpiryDate = (Get-Date).AddYears(2).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
        $PasswordCred = Add-MgApplicationPassword -ApplicationId $Application.Id -BodyParameter @{
            passwordCredential = @{
                displayName = "MigrationToolSecret"
                endDateTime = $ExpiryDate
            }
        }
    
        # --- OUTPUT ---
        Write-Host "`n-------------------------------------------------------" -ForegroundColor Yellow
        Write-Host "        SETUP COMPLETE - SAVE THESE DETAILS" -ForegroundColor Yellow
        Write-Host "-------------------------------------------------------" -ForegroundColor Yellow
        Write-Host "Application Name        : $AppName"
        Write-Host "Application (Client) ID : $($Application.AppId)"
        Write-Host "Client Secret Value     : $($PasswordCred.SecretText)"
        Write-Host "Directory (Tenant) ID   : $TenantId"
        Write-Warning "IMPORTANT: Copy the Client Secret Value immediately."
    
        }
        catch {
        Write-Error "Operation failed: $_"
        }
    
        # --- FINAL DISCONNECT ---
        Disconnect-MgGraph
        Read-Host "`nPress Enter to close this window"
        
  4. इन क्रेडेंशियल को नोट करें और इन्हें सुरक्षित तरीके से स्टोर करें. अगर क्रेडेंशियल लीक हो जाते हैं, तो हैकर आपके Exchange Online के पूरे डेटा को ऐक्सेस कर सकते हैं.
    • क्लाइंट सीक्रेट
    • ऐप्लिकेशन (क्लाइंट) का आईडी
    • डायरेक्ट्री (किरायेदार) का आईडी

मैन्युअल कनेक्शन सेट अप करने के लिए, Azure AD का इस्तेमाल करना

Microsoft के निर्देशों में, आपके Azure पोर्टल के वर्शन और Microsoft के अपडेट के हिसाब से अंतर हो सकता है. ऐप्लिकेशन रजिस्ट्रेशन और ऑथराइज़ेशन के बारे में नए दिशा-निर्देशों के लिए, Microsoft का दस्तावेज़ देखें.

पहला चरण: नया ऐप्लिकेशन रजिस्टर करना

सुरक्षा की वजहों से, हमारा सुझाव है कि नए ऐप्लिकेशन को सिंगल टेनेंट के तौर पर रजिस्टर करें.

  1. एडमिन के तौर पर, Microsoft Azure पोर्टल में साइन इन करें.
  2. Azure Active Directory (Azure AD) में, ऐप्लिकेशन रजिस्ट्रेशन पर जाएं.
  3. नया रजिस्ट्रेशन पर क्लिक करें और अपने ऐप्लिकेशन का नाम डालें. उदाहरण के लिए, Enterprise Migration App.
  4. इन खातों के लिए, सिंगल टेनेंट ऐप्लिकेशन बनाने के लिए सिर्फ़ इस संगठन की डायरेक्ट्री में मौजूद खाते पर क्लिक करें.
  5. रजिस्टर करें पर क्लिक करें.

दूसरा चरण: एपीआई की अनुमतियां कॉन्फ़िगर करना

नीचे दिए गए विकल्पों में से कोई एक चुनें:

पहला विकल्प: अनुमतियां मैन्युअल तरीके से जोड़ना

  1. बाईं ओर मौजूद नेविगेशन में, मैनेज करें के लिए, एपीआई की अनुमतियां पर क्लिक करें.
  2. अनुमति जोड़ेंइसके बादMicrosoft APIइसके बादMicrosoft Graph पर क्लिक करें.
  3. ऐप्लिकेशन की अनुमतियों के लिए, इनमें से कोई विकल्प चुनें:
    • calendars.read
    • mail.read
    • contacts.read
    • Directory.read.all
  4. [Your organization]के लिए एडमिन की सहमति दें पर क्लिक करें.

दूसरा विकल्प: ऐप्लिकेशन मेनिफ़ेस्ट में बदलाव करना

  1. ऐप्लिकेशन मेनिफ़ेस्ट खोलें.
  2. “resourceAccess” : [ ] के लिए, नीचे दिए गए कोड ब्लॉक को कॉपी करके चिपकाएं.

    अगर “resourceAccess” : [ ] में पहले से कोई वैल्यू मौजूद है, तो कॉमा जोड़ें. इसके बाद, कोड ब्लॉक चिपकाएं.

            
            { "id": "089fe4d0-434a-44c5-8827-41ba8a0b17f5", "type": "Role" },
            { "id": "810c84a8-4a9e-49e6-bf7d-12d183f40d01", "type": "Role" },
            { "id": "7ab1d382-f21e-4acd-a863-ba3e13f7da61", "type": "Role" },
            { "id": "798ee544-9d2d-430c-a058-570e29e34338", "type": "Role" }
            
            
  3. [Your organization]के लिए एडमिन की सहमति दें पर क्लिक करें.

तीसरा चरण: क्लाइंट सीक्रेट जनरेट करना

  1. बाईं ओर मौजूद नेविगेशन में, मैनेज करें के लिए, सर्टिफ़िकेट और सीक्रेटइसके बादनया क्लाइंट सीक्रेट पर क्लिक करें.
  2. ब्यौरा डालें, ऐक्सेस खत्म होने की अवधि चुनें, और जोड़ें पर क्लिक करें.
  3. क्लाइंट सीक्रेट वैल्यू को कॉपी करें और इसे सुरक्षित तरीके से सेव करें. यह वैल्यू सिर्फ़ एक बार दिखती है.

चौथा चरण: ऐप्लिकेशन के क्रेडेंशियल इकट्ठा करना

खास जानकारी पर क्लिक करें और इन क्रेडेंशियल को सुरक्षित तरीके से नोट करें:

  • ऐप्लिकेशन (क्लाइंट) का आईडी
  • डायरेक्ट्री (किरायेदार) का आईडी


Google, Google Workspace, और इनसे जुड़े चिह्न और लोगो, Google LLC के ट्रेडमार्क हैं. अन्य सभी कंपनी और प्रॉडक्ट के नाम, उन कंपनियों के ट्रेडमार्क हैं जिनसे वे जुड़े हैं.