ทำตามขั้นตอนต่อไปนี้เพื่อสร้างแอปพลิเคชัน Microsoft Azure ในพอร์ทัล Azure หากคุณใช้วิธีการนำเข้าข้อมูลขั้นสูงเพื่อคัดลอกข้อมูล OneDrive ไปยังบัญชี Google Workspace คุณต้องใช้แอปพลิเคชัน Azure เพื่อให้การนำเข้าข้อมูลเป็นไปอย่างปลอดภัย คุณเลือกใช้วิธีการใดวิธีการหนึ่งจาก 2 วิธีต่อไปนี้ได้
- ใช้สคริปต์ PowerShell เพื่อตั้งค่าการเชื่อมต่ออัตโนมัติ
- ใช้ Microsoft Azure เพื่อตั้งค่าการเชื่อมต่อด้วยตนเอง
ใช้สคริปต์ PowerShell เพื่อตั้งค่าการเชื่อมต่ออัตโนมัติ
คุณต้องเป็นผู้ดูแลระบบที่มีบทบาทเป็นผู้ดูแลระบบส่วนกลางหรือผู้ดูแลระบบที่มีบทบาทที่มีสิทธิ์เพื่อทำตามขั้นตอนเหล่านี้ให้เสร็จสมบูรณ์
ตัวเลือกที่ 1: ใช้ 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 --- # Updated Map containing only the requested Graph permissions $PermissionMap = @{ "licenseassignment.read.all" = "LicenseAssignment.Read.All" "application.read.all" = "Application.Read.All" } $TenantId = $Context.TenantId $GraphAppId = "00000003-0000-0000-c000-000000000000" $SpoAppId = "00000003-0000-0ff1-ce00-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 # 1. Process Microsoft Graph Permissions $GraphSP = Get-MgServicePrincipal -Filter "AppId eq '$GraphAppId'" | Select-Object -First 1 $GraphResourceAccessList = @() foreach ($key in $PermissionMap.Keys) { $RealRoleName = $PermissionMap[$key] $Role = $GraphSP.AppRoles | Where-Object { $_.Value -eq $RealRoleName } if ($Role) { $GraphResourceAccessList += @{ 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 (Graph): $RealRoleName" -ForegroundColor Gray } } # 2. Process SharePoint Online Permissions $SpoSP = Get-MgServicePrincipal -Filter "AppId eq '$SpoAppId'" | Select-Object -First 1 $SpoResourceAccessList = @() $SpoRole = $SpoSP.AppRoles | Where-Object { $_.Value -eq "Sites.FullControl.All" } if ($SpoRole) { $SpoResourceAccessList += @{ id = $SpoRole.Id; type = "Role" } New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $NewServicePrincipal.Id -BodyParameter @{ principalId = $NewServicePrincipal.Id resourceId = $SpoSP.Id appRoleId = $SpoRole.Id } | Out-Null Write-Host " - Granted (SharePoint): Sites.FullControl.All" -ForegroundColor Gray } Update-MgApplication -ApplicationId $Application.Id -RequiredResourceAccess @( @{ resourceAppId = $GraphAppId; resourceAccess = $GraphResourceAccessList }, @{ resourceAppId = $SpoAppId; resourceAccess = $SpoResourceAccessList } ) # --- 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"
- จดข้อมูลเข้าสู่ระบบต่อไปนี้และจัดเก็บไว้อย่างปลอดภัย หากข้อมูลเข้าสู่ระบบรั่วไหล แฮ็กเกอร์อาจเข้าถึงข้อมูล OneDrive ทั้งหมดของคุณได้
- รหัสลับไคลเอ็นต์
- รหัสแอปพลิเคชัน (ไคลเอ็นต์)
- รหัสไดเรกทอรี (ผู้เช่า)
ตัวเลือกที่ 2: ใช้ Windows PowerShell
- ใน Windows ให้สร้างไฟล์ข้อความธรรมดาใหม่และตั้งชื่อว่า 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 --- # Application Permissions mapped to their respective API App IDs $ApiConfigurations = @{ "00000003-0000-0000-c000-000000000000" = @("LicenseAssignment.Read.All", "Application.Read.All") # Microsoft Graph "00000003-0000-0ff1-ce00-000000000000" = @("Sites.FullControl.All") # SharePoint Online } $TenantId = $Context.TenantId 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 $RequiredResourceAccess = @() foreach ($ApiAppId in $ApiConfigurations.Keys) { $ApiSP = Get-MgServicePrincipal -Filter "AppId eq '$ApiAppId'" | Select-Object -First 1 $ResourceAccessList = @() foreach ($RoleName in $ApiConfigurations[$ApiAppId]) { $Role = $ApiSP.AppRoles | Where-Object { $_.Value -eq $RoleName } if ($Role) { $ResourceAccessList += @{ id = $Role.Id; type = "Role" } New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $NewServicePrincipal.Id -BodyParameter @{ principalId = $NewServicePrincipal.Id resourceId = $ApiSP.Id appRoleId = $Role.Id } | Out-Null Write-Host " - Granted: $RoleName" -ForegroundColor Gray } } if ($ResourceAccessList.Count -gt 0) { $RequiredResourceAccess += @{ resourceAppId = $ApiAppId resourceAccess = $ResourceAccessList } } } Update-MgApplication -ApplicationId $Application.Id -RequiredResourceAccess $RequiredResourceAccess # --- 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"
- จดข้อมูลเข้าสู่ระบบต่อไปนี้และจัดเก็บไว้อย่างปลอดภัย หากข้อมูลเข้าสู่ระบบรั่วไหล แฮ็กเกอร์อาจเข้าถึงข้อมูล OneDrive ทั้งหมดของคุณได้
- รหัสลับไคลเอ็นต์
- รหัสแอปพลิเคชัน (ไคลเอ็นต์)
- รหัสไดเรกทอรี (ผู้เช่า)
ใช้ Microsoft Azure เพื่อตั้งค่าการเชื่อมต่อด้วยตนเอง
ขั้นตอนเฉพาะของ Microsoft อาจแตกต่างกันไปตามเวอร์ชันพอร์ทัล Azure และการอัปเดตที่ Microsoft ทำ โปรดดูคำแนะนำล่าสุดเกี่ยวกับการจดทะเบียนและการให้สิทธิ์แอปในเอกสารประกอบของ Microsoft
ขั้นตอนที่ 1: จดทะเบียนแอปพลิเคชันใหม่
- ลงชื่อเข้าใช้พอร์ทัล Azure ในฐานะผู้ดูแลระบบ
- ในบริการ Azure ให้ไปที่การจดทะเบียนแอป
- คลิก New Registration แล้วป้อนชื่อแอปพลิเคชัน (เช่น แอปนำเข้าขั้นสูง)
- สำหรับประเภทบัญชีที่รองรับ ให้คลิก Accounts in this organizational directory only เพื่อสร้างแอปพลิเคชันผู้เช่ารายเดียว
- คลิกลงทะเบียน
ขั้นตอนที่ 2: กำหนดค่าสิทธิ์ API
เลือกตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้
ตัวเลือกที่ 1: เพิ่มสิทธิ์ด้วยตนเอง
- คลิก API permissions ในส่วน Manage ทางด้านข้าง
- คลิก Add a permission แล้วคลิก Sharepoint ในแท็บ Microsoft APIs
- คลิก Application permissions แล้วเลือกช่อง Sites.FullControl.All ในเมนูแบบเลื่อนลง Sites
- คลิก Add permission
- กลับไปที่ Add a permission แล้วเลือก Microsoft Graph
- คลิก Application permissions แล้วให้สิทธิ์ต่อไปนี้
- LicenseAssignment.Read.All
- Application.Read.All
- คลิก Add permission
- คลิก Grant admin consent for your organization เพื่อให้แน่ใจว่าแอปพลิเคชันมีสิทธิ์เข้าถึงข้อมูล
ตัวเลือกที่ 2: แก้ไขไฟล์ Manifest ของแอปพลิเคชัน
- เปิดไฟล์ Manifest ของแอปพลิเคชัน
- ไปที่ “resourceAccess” : [ ] แล้วเลือกตัวเลือกต่อไปนี้
- หาก “resourceAccess” : [ ] มีค่าอยู่แล้ว ให้ใส่คอมมาแล้ววางโค้ดบล็อกต่อไปนี้
- หาก “resourceAccess” : [ ] ไม่มีค่า ให้คัดลอกและวางบล็อกโค้ดต่อไปนี้
"requiredResourceAccess": [ { "resourceAppId": "00000003-0000-0000-c000-000000000000", "resourceAccess": [ { "id": "e2f98668-2877-4f38-a2f4-8202e0717aa1", "type": "Role" }, { "id": "9a5d68dd-52b0-4cc2-bd40-abcf44ac3a30", "type": "Role" } ] }, { "resourceAppId": "00000003-0000-0ff1-ce00-000000000000", "resourceAccess": [ { "id": "678536fe-1083-478a-9c59-b99265e6b0d3", "type": "Role" } ] } ]
- คลิก Grant admin consent for your organization
ขั้นตอนที่ 3: สร้างรหัสลับไคลเอ็นต์
- ในส่วน Manage ทางด้านข้าง ให้คลิก Certificates & secrets
New client secret
- ป้อนคำอธิบาย เลือกระยะเวลาหมดอายุ แล้วคลิก Add
- คัดลอกค่ารหัสลับไคลเอ็นต์ และจัดเก็บไว้อย่างปลอดภัย โดยค่าจะแสดงเพียงครั้งเดียว
ขั้นตอนที่ 4: รวบรวมข้อมูลเข้าสู่ระบบของแอปพลิเคชัน
สำคัญ: จัดเก็บข้อมูลเข้าสู่ระบบของแอปพลิเคชันไว้อย่างปลอดภัย หากข้อมูลเข้าสู่ระบบรั่วไหล แฮ็กเกอร์อาจเข้าถึงข้อมูล OneDrive ทั้งหมดของคุณได้
คลิก Overview แล้วจดข้อมูลเข้าสู่ระบบต่อไปนี้ไว้อย่างปลอดภัย
- รหัสแอปพลิเคชัน (ไคลเอ็นต์)
- รหัสไดเรกทอรี (ผู้เช่า)
Google, Google Workspace รวมถึงเครื่องหมายและโลโก้ที่เกี่ยวข้องเป็นเครื่องหมายการค้าของ Google LLC ชื่อบริษัทและชื่อผลิตภัณฑ์อื่นๆ ทั้งหมดเป็นเครื่องหมายการค้าของบริษัทที่เกี่ยวข้อง