Ikuti langkah-langkah berikut untuk membuat aplikasi Microsoft Azure di portal Azure. Jika Anda menggunakan metode impor data lanjutan untuk menyalin data Exchange Online ke akun Google Workspace, Anda memerlukan aplikasi Azure untuk memastikan impor data yang aman. Anda dapat memilih salah satu dari 2 metode:
- Menggunakan skrip PowerShell untuk menyiapkan koneksi otomatis
- Menggunakan Azure untuk menyiapkan koneksi manual
Menggunakan skrip PowerShell untuk menyiapkan koneksi otomatis
Anda harus menjadi administrator peran global atau istimewa untuk menyelesaikan langkah-langkah ini.
Opsi 1: Menggunakan Azure Cloud Shell
- Login ke portal Azure Anda sebagai administrator.
- Klik Cloud Shell
Powershell.
- Jika diminta, buat akun penyimpanan dan setujui setelan default.
- Untuk membuat aplikasi, masukkan perintah berikut
klik Enter:
Install-Module Microsoft.Graph -Scope CurrentUser
- Jika Anda melihat perintah untuk menginstal dari Repositori Tidak Tepercaya, masukkan Y
klik Enter.
- Salin blok kode berikut, tempelkan ke PowerShell, lalu klik 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 --- # Updated Map containing all the requested application permissions $PermissionMap = @{ "calendars.read" = "Calendars.Read" "contacts.read" = "Contacts.Read" "directory.read.all" = "Directory.Read.All" "group-conversation.read.all" = "Group-Conversation.Read.All" "mail.read" = "Mail.Read" "mailboxfolder.read.all" = "MailboxFolder.Read.All" "mailboxitem.export.all" = "MailboxItem.Export.All" "mailboxitem.read.all" = "MailboxItem.Read.All" "mailboxsettings.read" = "MailboxSettings.Read" "tasks.read.all" = "Tasks.Read.All" "user.read.all" = "User.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"
- Perhatikan kredensial berikut dan simpan dengan aman. Jika kredensial bocor, peretas dapat mengakses semua data Exchange Online Anda.
- Rahasia klien
- Application (client) ID
- Directory (tenant) ID
Opsi 2: Menggunakan Windows PowerShell
- Di Windows, buat file teks biasa baru dan beri nama migration_app_creator.ps1.
- Salin blok kode berikut, tempelkan ke file baru, lalu klik Run with Powershell.
- Perhatikan kredensial berikut dan simpan dengan aman. Jika kredensial bocor, peretas dapat mengakses semua data Exchange Online Anda.
- Rahasia klien
- Application (client) ID
- Directory (tenant) ID
<# .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 --- # Updated Map containing all the requested application permissions $PermissionMap = @{ "calendars.read" = "Calendars.Read" "contacts.read" = "Contacts.Read" "directory.read.all" = "Directory.Read.All" "group-conversation.read.all" = "Group-Conversation.Read.All" "mail.read" = "Mail.Read" "mailboxfolder.read.all" = "MailboxFolder.Read.All" "mailboxitem.export.all" = "MailboxItem.Export.All" "mailboxitem.read.all" = "MailboxItem.Read.All" "mailboxsettings.read" = "MailboxSettings.Read" "tasks.read.all" = "Tasks.Read.All" "user.read.all" = "User.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"
Menggunakan Azure untuk menyiapkan koneksi manual
Tergantung versi portal Azure dan update dari Microsoft, mungkin akan ada perbedaan pada langkah-langkah spesifik Microsoft dalam panduan ini. Lihat dokumentasi Microsoft untuk mendapatkan panduan terbaru tentang pendaftaran dan otorisasi aplikasi.
Langkah 1: Daftarkan aplikasi baru
Demi keamanan, sebaiknya Anda mendaftarkan aplikasi baru sebagai satu tenant.
- Login ke portal Azure Anda sebagai administrator.
- Di Azure Services, buka App registrations.
- Klik New Registration, lalu masukkan nama untuk aplikasi Anda (misalnya, Advanced import app).
- Untuk Supported account types, klik Accounts in this organizational directory only untuk membuat aplikasi tenant tunggal.
- Klik Daftar.
Langkah 2: Konfigurasi izin API
Pilih salah satu opsi berikut:
Opsi 1: Menambahkan izin secara manual
- Di samping, untuk Manage, klik API permissions.
- Klik Add a permission
Microsoft APIs
Microsoft Graph.
- Untuk application permissions, pilih:
- Calendars.Read
- Contacts.Read
- Directory.Read.All
- Group-Conversation.Read.All
- Mail.Read
- MailboxFolder.Read.All
- MailboxItem.Export.All
- MailboxItem.Read.All
- MailboxSettings.Read
- Tasks.Read.All
- User.Read.All
- Klik Grant admin consent for organisasi Anda.
Opsi 2: Mengedit manifes aplikasi
- Buka manifes aplikasi.
- Buka “resourceAccess” : [ ], lalu pilih salah satu opsi:
- Jika “resourceAccess” : [ ] sudah memiliki nilai, tambahkan koma, lalu tempel blok kode berikut.
- Jika “resourceAccess” : [ ] tidak memiliki nilai, salin dan tempel blok kode berikut.
{ "id": "798ee544-9d2d-430c-a058-570e29e34338", "type": "Role" },
{ "id": "089fe4d0-434a-44c5-8827-41ba8a0b17f5", "type": "Role" },
{ "id": "7ab1d382-f21e-4acd-a863-ba3e13f7da61", "type": "Role" },
{ "id": "4f0a8235-6f6f-4ec7-9500-34b452a4a0c3", "type": "Role" },
{ "id": "810c84a8-4a9e-49e6-bf7d-12d183f40d01", "type": "Role" },
{ "id": "99280d24-a782-4793-93cc-0888549957f6", "type": "Role" },
{ "id": "937550e9-33a3-494b-88ae-d9cd394b1fbb", "type": "Role" },
{ "id": "7d9f353d-a7bd-4fbb-822a-26d5dd39a3ce", "type": "Role" },
{ "id": "40f97065-369a-49f4-947c-6a255697ae91", "type": "Role" },
{ "id": "f10e1f91-74ed-437f-a6fd-d6ae88e26c1f", "type": "Role" },
{ "id": "df021288-bdef-4463-88db-98f22de89214", "type": "Role" }
- Klik Grant admin consent for organisasi Anda.
Langkah 3: Membuat rahasia klien
- Di samping, untuk Manage, klik Certificates & secrets
New client secret.
- Tambahkan deskripsi, pilih periode habis masa berlaku, lalu klik Add.
- Salin nilai rahasia klien dan simpan dengan aman. Nilai hanya akan ditampilkan satu kali.
Langkah 4: Kumpulkan kredensial aplikasi
Penting: Simpan kredensial aplikasi dengan aman. Jika kredensial bocor, peretas dapat mengakses semua data Exchange Anda.
Klik Overview, lalu catat kredensial berikut dengan aman:
- Application (client) ID
- Directory (tenant) ID
Menambahkan hak istimewa pengguna super untuk impor data terenkripsi (beta)
Jika impor data Anda menyertakan email atau file terenkripsi, ikuti langkah-langkah berikut untuk menerapkan hak istimewa pengguna super Microsoft Information Protection (MIP) ke client ID untuk aplikasi Azure Anda. Alat impor data memerlukan hak istimewa AipServiceSuperUser untuk mendekripsi data di Workspace.
Selesaikan langkah-langkah ini di perangkat Windows yang login sebagai administrator peran global atau istimewa.
- Di Windows, buka PowerShell dan pilih Run as administrator.
Untuk menginstal modul AIPService, masukkan perintah berikut, lalu tekan Enter:
Install-Module -Name AIPService -Scope CurrentUser -ForceImport-Module AIPServiceUntuk terhubung ke layanan Azure Information Protection (AIP), masukkan perintah berikut, lalu tekan Enter:
Connect-AipServiceUntuk menambahkan hak istimewa AipServiceSuperUser ke client ID Anda, masukkan perintah berikut, lalu tekan Enter:
Add -AipServiceSuperUser -ServicePrincipalId "*application-client-id*"(Opsional) Untuk memastikan status pengguna super Anda diaktifkan, masukkan perintah berikut, lalu tekan Enter:
Get-AipServiceSuperUserFeature(Opsional) Untuk melihat aplikasi mana yang memiliki akses pengguna super, masukkan perintah berikut, lalu tekan Enter:
Get-AipServiceSuperUser
Google, Google Workspace, serta merek dan logo terkait adalah merek dagang Google LLC. Semua nama perusahaan dan produk lainnya adalah merek dagang milik setiap perusahaan terkait.