Azure पोर्टल में Microsoft Azure ऐप्लिकेशन बनाने के लिए, यह तरीका अपनाएं. आपको ऐप्लिकेशन बनाना होगा, ताकि Microsoft Exchange Online से आपके Google Workspace खातों में डेटा सुरक्षित तरीके से माइग्रेट किया जा सके. इसके लिए, इनमें से कोई एक तरीका चुना जा सकता है:
- अपने-आप कनेक्ट होने की सुविधा सेट अप करने के लिए, PowerShell स्क्रिप्ट का इस्तेमाल करना
- मैन्युअल कनेक्शन सेट अप करने के लिए, Azure Active Directory का इस्तेमाल करना
अपने-आप कनेक्ट होने की सुविधा सेट अप करने के लिए, PowerShell स्क्रिप्ट का इस्तेमाल करना
इन चरणों को पूरा करने के लिए, आपके पास ग्लोबल या खास भूमिका वाले एडमिन का ऐक्सेस होना चाहिए.
पहला विकल्प: Azure Cloud Shell का इस्तेमाल करना
- एडमिन के तौर पर, Azure पोर्टल में साइन इन करें.
- Cloud Shell
Powershell पर क्लिक करें.
- अगर कहा जाए, तो स्टोरेज खाता बनाएं और डिफ़ॉल्ट सेटिंग स्वीकार करें.
- ऐप्लिकेशन बनाने के लिए, यह निर्देश डालें. इसके बाद, Enter पर क्लिक करें:
Install-Module Microsoft.Graph -Scope CurrentUser
- अगर आपको किसी ऐसी रिपॉज़िटरी से इंस्टॉल करने का प्रॉम्प्ट दिखता है जिस पर भरोसा नहीं किया जा सकता, तो Y डालें. इसके बाद, Enter पर क्लिक करें.
- यहां दिए गए कोड ब्लॉक को कॉपी करें, इसे 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"
- इन क्रेडेंशियल को नोट करें और इन्हें सुरक्षित तरीके से स्टोर करें. अगर क्रेडेंशियल लीक हो जाते हैं, तो हैकर आपके Exchange Online के पूरे डेटा को ऐक्सेस कर सकते हैं.
- क्लाइंट सीक्रेट
- ऐप्लिकेशन (क्लाइंट) का आईडी
- डायरेक्ट्री (किरायेदार) का आईडी
दूसरा विकल्प: Windows PowerShell का इस्तेमाल करना
- Windows में, एक नई सादी टेक्स्ट फ़ाइल बनाएं और उसका नाम migration_app_creator.ps1 रखें.
- यहां दिए गए कोड ब्लॉक को कॉपी करें और नई फ़ाइल में चिपकाएं. इसके बाद, Powershell के साथ चलाएं पर क्लिक करें.
<# .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"
- क्लाइंट सीक्रेट
- ऐप्लिकेशन (क्लाइंट) का आईडी
- डायरेक्ट्री (किरायेदार) का आईडी
मैन्युअल कनेक्शन सेट अप करने के लिए, Azure Active Directory का इस्तेमाल करना
Microsoft के निर्देशों में, आपके Azure पोर्टल के वर्शन और Microsoft के अपडेट के हिसाब से अंतर हो सकता है. ऐप्लिकेशन रजिस्ट्रेशन और ऑथराइज़ेशन के बारे में नए दिशा-निर्देशों के लिए, Microsoft का दस्तावेज़ देखें.
पहला चरण: नया ऐप्लिकेशन रजिस्टर करना
सुरक्षा की वजहों से, हमारा सुझाव है कि नए ऐप्लिकेशन को सिंगल टेनेंट के तौर पर रजिस्टर करें.
- एडमिन के तौर पर, Azure पोर्टल में साइन इन करें.
- Azure Active Directory (Azure AD) में, ऐप्लिकेशन रजिस्ट्रेशन पर जाएं.
- नया रजिस्ट्रेशन पर क्लिक करें और अपने ऐप्लिकेशन का नाम डालें. उदाहरण के लिए, Advanced migration app.
- इन खाता टाइप के साथ काम करता है के लिए, सिंगल टेनेंट ऐप्लिकेशन बनाने के लिए सिर्फ़ इस संगठन की डायरेक्ट्री में मौजूद खाते पर क्लिक करें.
- रजिस्टर करें पर क्लिक करें.
दूसरा चरण: एपीआई की अनुमतियां कॉन्फ़िगर करना
नीचे दिए विकल्प में से एक चुनें:
पहला विकल्प: अनुमतियां मैन्युअल तरीके से जोड़ना
- साइड में मौजूद, मैनेज करें के लिए, एपीआई की अनुमतियां पर क्लिक करें.
- अनुमति जोड़ें
Microsoft API
Microsoft Graph पर क्लिक करें.
- ऐप्लिकेशन की अनुमतियों के लिए, इनमें से कोई विकल्प चुनें:
- calendars.read
- mail.read
- contacts.read
- Directory.read.all
- अपने संगठन के लिए एडमिन की सहमति दें पर क्लिक करें.
दूसरा विकल्प: ऐप्लिकेशन मेनिफ़ेस्ट में बदलाव करना
- ऐप्लिकेशन मेनिफ़ेस्ट खोलें.
- “resourceAccess” : [ ] पर जाएं और कोई विकल्प चुनें:
- अगर “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" }
- अपने संगठन के लिए एडमिन की सहमति दें पर क्लिक करें.
तीसरा चरण: क्लाइंट सीक्रेट जनरेट करना
- साइड में मौजूद, मैनेज करें के लिए, सर्टिफ़िकेट और सीक्रेट
नया क्लाइंट सीक्रेट पर क्लिक करें.
- ब्यौरा डालें, ऐक्सेस खत्म होने की अवधि चुनें, और जोड़ें पर क्लिक करें.
- क्लाइंट सीक्रेट वैल्यू को कॉपी करें और इसे सुरक्षित तरीके से सेव करें. यह वैल्यू सिर्फ़ एक बार दिखती है.
चौथा चरण: ऐप्लिकेशन के क्रेडेंशियल इकट्ठा करना
अहम जानकारी: ऐप्लिकेशन के क्रेडेंशियल को सुरक्षित तरीके से सेव करें. अगर क्रेडेंशियल लीक हो जाते हैं, तो हैकर आपके Exchange खाते का सारा डेटा ऐक्सेस कर सकते हैं.
खास जानकारी पर क्लिक करें और इन क्रेडेंशियल को सुरक्षित तरीके से नोट करें:
- ऐप्लिकेशन (क्लाइंट) का आईडी
- डायरेक्ट्री (किरायेदार) का आईडी
Google, Google Workspace, और इनसे जुड़े चिह्न और लोगो, Google LLC के ट्रेडमार्क हैं. अन्य सभी कंपनी और प्रॉडक्ट के नाम, उन कंपनियों के ट्रेडमार्क हैं जिनसे वे जुड़े हैं.