برای ایجاد یک برنامه Microsoft Azure در پورتال Azure، این مراحل را دنبال کنید. برای اطمینان از انتقال ایمن دادهها از Microsoft Exchange Online به حسابهای Google Workspace خود، باید برنامه را ایجاد کنید. میتوانید یکی از دو روش زیر را انتخاب کنید:
- برای تنظیم اتصال خودکار از یک اسکریپت PowerShell استفاده کنید
- برای تنظیم اتصال دستی از Azure Active Directory استفاده کنید
برای تنظیم اتصال خودکار از یک اسکریپت PowerShell استفاده کنید
برای انجام این مراحل، شما باید یک مدیر نقش سراسری یا ممتاز باشید.
گزینه ۱: استفاده از Azure Cloud Shell
- به عنوان مدیر، وارد پورتال Azure خود شوید.
- روی پوسته ابری کلیک کنید
پاورشل
- در صورت درخواست، یک حساب ذخیرهسازی ایجاد کنید و تنظیمات پیشفرض را بپذیرید.
- برای ایجاد برنامه، دستور زیر را وارد کنید و سپس روی Enter کلیک کنید:
نصب ماژول Microsoft.Graph -Scope CurrentUser
- اگر پیامی مبنی بر نصب از یک مخزن غیرقابل اعتماد (Untrusted Repository) مشاهده کردید، 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 شما دسترسی پیدا کنند.
- راز مشتری
- شناسه برنامه (کلاینت)
- شناسه دایرکتوری (مستاجر)
گزینه دوم: استفاده از پاورشل ویندوز
- در ویندوز، یک فایل متنی ساده جدید ایجاد کنید و نام آن را migration_app_creator.ps1 بگذارید.
- بلوک کد زیر را کپی کنید، آن را در فایل جدید جایگذاری کنید و روی Run with 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 استفاده کنید
مراحل خاص مایکروسافت ممکن است بسته به نسخه پورتال Azure شما و بهروزرسانیهای انجام شده توسط مایکروسافت متفاوت باشد. برای جدیدترین راهنماییها در مورد ثبت و مجوز برنامه، به مستندات مایکروسافت مراجعه کنید.
مرحله ۱: ثبت درخواست جدید
به دلایل امنیتی، توصیه میکنیم درخواست جدید را به عنوان مستاجر مجرد ثبت کنید.
- به عنوان مدیر، وارد پورتال Azure خود شوید.
- در Azure Active Directory (Azure AD) ، به بخش ثبت نام برنامهها (App registrations) بروید.
- روی ثبت نام جدید کلیک کنید و یک نام برای برنامه خود وارد کنید (برای مثال، برنامه مهاجرت پیشرفته).
- برای انواع حسابهای پشتیبانیشده ، روی «حسابها در این فهرست سازمانی فقط» کلیک کنید تا یک برنامه مستاجر واحد ایجاد شود.
- روی ثبت نام کلیک کنید.
مرحله ۲: پیکربندی مجوزهای API
یکی از گزینههای زیر را انتخاب کنید:
گزینه ۱: اضافه کردن دستی مجوزها
- در کنار آن، برای مدیریت (Manage )، روی مجوزهای API کلیک کنید.
- روی افزودن مجوز کلیک کنید
رابطهای برنامهنویسی کاربردی مایکروسافت
مایکروسافت گراف .
- برای مجوزهای برنامه ، موارد زیر را انتخاب کنید:
- تقویمها.بخوانید
- ایمیل.خواندن
- مخاطبین. بخوانید
- فهرست.خواندن.همه
- روی اعطای مجوز مدیر به سازمان خود کلیک کنید.
گزینه ۲: ویرایش مانیفست برنامه
- مانیفست برنامه را باز کنید.
- به «resourceAccess» بروید: [ ] و یک گزینه را انتخاب کنید:
- اگر عبارت “resourceAccess”: [] از قبل مقداری دارد، یک کاما اضافه کنید و سپس قطعه کد زیر را جایگذاری کنید.
- اگر عبارت “resourceAccess”: [ ] مقداری ندارد، قطعه کد زیر را کپی و جایگذاری کنید.
{"شناسه": "089fe4d0-434a-44c5-8827-41ba8a0b17f5", "نوع": "نقش" },
{"شناسه": "810c84a8-4a9e-49e6-bf7d-12d183f40d01", "نوع": "نقش" },
{"id": "7ab1d382-f21e-4acd-a863-ba3e13f7da61", "type": "نقش" },
{"شناسه": "798ee544-9d2d-430c-a058-570e29e34338", "نوع": "نقش" }
- روی اعطای مجوز مدیر به سازمان خود کلیک کنید.
مرحله ۳: ایجاد رمز کلاینت
- در کنار، برای مدیریت ، روی گواهینامهها و اسرار کلیک کنید
راز مشتری جدید .
- توضیحی وارد کنید، دوره انقضا را انتخاب کنید و روی افزودن کلیک کنید.
- مقدار مخفی کلاینت را کپی کرده و آن را در جای امنی ذخیره کنید. این مقدار فقط یک بار نمایش داده میشود.
مرحله ۴: جمعآوری مدارک درخواست
مهم : اطلاعات کاربری برنامه را به طور ایمن ذخیره کنید. در صورت فاش شدن اطلاعات کاربری، هکرها میتوانند به تمام دادههای Exchange شما دسترسی پیدا کنند.
روی Overview کلیک کنید و اطلاعات کاربری زیر را یادداشت کنید:
- شناسه برنامه (کلاینت)
- شناسه دایرکتوری (مستاجر)
گوگل، گوگل ورکاسپیس و علامتها و لوگوهای مرتبط، علائم تجاری شرکت گوگل هستند. سایر نامهای شرکتها و محصولات، علائم تجاری شرکتهایی هستند که با آنها مرتبط هستند.