Aby utworzyć aplikację Microsoft Azure w portalu Azure, wykonaj te czynności. Jeśli używasz zaawansowanej metody importowania danych, aby skopiować dane z Exchange Online na konta Google Workspace, potrzebujesz aplikacji Azure, aby zapewnić bezpieczne importowanie danych. Możesz wybrać jedną z 2 metod:
- Konfigurowanie automatycznego połączenia za pomocą skryptu PowerShell
- Konfigurowanie połączenia ręcznego za pomocą Azure
Konfigurowanie automatycznego połączenia za pomocą skryptu PowerShell
Aby wykonać te czynności, musisz być administratorem globalnym lub administratorem ról uprzywilejowanych.
Opcja 1. Użyj Azure Cloud Shell
- Zaloguj się w portalu Azure jako administrator.
- Kliknij Cloud Shell
Powershell.
- Jeśli pojawi się taka prośba, utwórz konto magazynu i zaakceptuj ustawienia domyślne.
- Aby utworzyć aplikację, wpisz to polecenie
naciśnij Enter:
Install-Module Microsoft.Graph -Scope CurrentUser
- Jeśli pojawi się prośba o zainstalowanie z niezaufanego repozytorium, wpisz Y
naciśnij Enter.
- Skopiuj poniższy blok kodu, wklej go w PowerShell i naciśnij 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"
- Zapisz te dane logowania i przechowuj je w bezpiecznym miejscu. Jeśli dane logowania wyciekną, hakerzy mogą uzyskać dostęp do wszystkich Twoich danych Exchange Online.
- Tajny klucz klienta
- Identyfikator aplikacji (klienta)
- Identyfikator katalogu (najemcy)
Opcja 2. Użyj Windows PowerShell
- W systemie Windows utwórz nowy plik w formacie zwykłego tekstu i nadaj mu nazwę migration_app_creator.ps1.
- Skopiuj poniższy blok kodu, wklej go do nowego pliku i kliknij Run with Powershell (Uruchom za pomocą Powershell).
- Zapisz te dane logowania i przechowuj je w bezpiecznym miejscu. Jeśli dane logowania wyciekną, hakerzy mogą uzyskać dostęp do wszystkich Twoich danych Exchange Online.
- Tajny klucz klienta
- Identyfikator aplikacji (klienta)
- Identyfikator katalogu (najemcy)
<# .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"
Konfigurowanie połączenia ręcznego za pomocą Azure
Szczegółowe czynności, które należy wykonać w programach Microsoft, mogą się różnić w zależności od wersji portalu Azure i aktualizacji wprowadzonych przez firmę Microsoft. Najnowsze wskazówki dotyczące rejestracji i autoryzacji aplikacji znajdziesz w dokumentacji firmy Microsoft.
Krok 1. Zarejestruj nową aplikację
Ze względów bezpieczeństwa zalecamy zarejestrowanie nowej aplikacji jako jednego najemcy.
- Zaloguj się w portalu Azure jako administrator.
- W Azure Services (Usługi Azure) otwórz App registrations (Rejestracje aplikacji).
- Kliknij New Registration (Nowa rejestracja) i wpisz nazwę aplikacji (np. Advanced import app).
- W sekcji Supported account types (Obsługiwane typy kont) kliknij Accounts in this organizational directory only (Tylko konta w tym katalogu organizacyjnym), aby utworzyć aplikację dla jednego najemcy.
- Kliknij Zarejestruj.
Krok 2. Skonfiguruj uprawnienia dotyczące interfejsu API
Wybierz jedną z tych opcji:
Opcja 1. Ręczne dodawanie uprawnień
- Z boku w sekcji Zarządzaj kliknij Uprawnienia interfejsu API.
- Kliknij Add a permission (Dodaj uprawnienie)
Microsoft APIs (Interfejsy API Microsoftu)
Microsoft Graph.
- W przypadku uprawnień aplikacji wybierz:
- 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
- Kliknij Grant admin consent for (Przyznaj zgodę administratora dla) nazwa organizacji.
Opcja 2. Edytowanie pliku manifestu aplikacji
- Otwórz plik manifestu aplikacji.
- Przejdź do “resourceAccess” : [ ] i wybierz opcję:
- Jeśli “resourceAccess” : [ ] ma już wartość, dodaj przecinek, a następnie wklej ten blok kodu.
- Jeśli “resourceAccess” : [ ] nie ma wartości, skopiuj i wklej ten blok kodu.
{ "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" }
- Kliknij Grant admin consent for (Przyznaj zgodę administratora dla) nazwa organizacji.
Krok 3. Wygeneruj tajny klucz klienta
- Z boku w sekcji Manage (Zarządzaj) kliknij Certificates & secrets (Certyfikaty i obiekty tajne)
New client secret (Nowy tajny klucz klienta).
- Wpisz opis, wybierz okres ważności i kliknij Dodaj.
- Skopiuj wartość tajnego klucza klienta i zapisz ją w bezpiecznym miejscu. Wartość jest wyświetlana tylko raz.
Krok 4. Zbierz dane logowania aplikacji
Ważne: przechowuj dane logowania do aplikacji w bezpiecznym miejscu. Jeśli dane logowania wyciekną, hakerzy mogą uzyskać dostęp do wszystkich danych Exchange.
Kliknij Overview (Przegląd) i zapisz te dane logowania:
- Identyfikator aplikacji (klienta)
- Identyfikator katalogu (najemcy)
Dodawanie uprawnień superużytkownika do importowania zaszyfrowanych danych (beta)
Jeśli importowane dane zawierają zaszyfrowane e-maile lub pliki, wykonaj te czynności, aby zastosować uprawnienia superużytkownika Microsoft Information Protection (MIP) do identyfikatora klienta aplikacji Azure. Narzędzie do importowania danych potrzebuje uprawnień AipServiceSuperUser, aby odszyfrować dane w Workspace.
Wykonaj te czynności na urządzeniu z systemem Windows, na którym zalogowano się jako administrator globalny lub administrator z uprawnieniami.
- W systemie Windows otwórz PowerShell i wybierz Uruchom jako administrator.
Aby zainstalować moduł AIPService, wpisz te polecenia i naciśnij Enter:
Install-Module -Name AIPService -Scope CurrentUser -ForceImport-Module AIPServiceAby połączyć się z usługą Azure Information Protection (AIP), wpisz to polecenie i naciśnij Enter:
Connect-AipServiceAby dodać uprawnienia AipServiceSuperUser do identyfikatora klienta, wpisz to polecenie i naciśnij Enter:
Add -AipServiceSuperUser -ServicePrincipalId "*application-client-id*"(Opcjonalnie) Aby upewnić się, że masz uprawnienia superużytkownika, wpisz to polecenie i naciśnij Enter:
Get-AipServiceSuperUserFeature(Opcjonalnie) Aby sprawdzić, które aplikacje mają dostęp superużytkownika, wpisz to polecenie i naciśnij Enter:
Get-AipServiceSuperUser
Google, Google Workspace oraz powiązane znaki i logotypy są znakami towarowymi firmy Google LLC. Wszystkie inne nazwy firm i produktów są znakami towarowymi należącymi do ich właścicieli.