הגדרת אפליקציית Azure ל-OneDrive ול-SharePoint Online

כדי ליצור אפליקציית Microsoft Azure בפורטל Azure, פועלים לפי השלבים הבאים. אם אתם משתמשים בשיטה המתקדמת לייבוא נתונים כדי להעתיק נתונים מ-OneDrive או מ-SharePoint Online (Microsoft 365) לחשבונות Google Workspace, אתם צריכים את אפליקציית Azure כדי לוודא שהנתונים מיובאים בצורה מאובטחת. אפשר לבחור באחת משתי שיטות:

שימוש בסקריפט של PowerShell כדי להגדיר חיבור אוטומטי

כדי לבצע את השלבים האלה, אתם צריכים להיות אדמינים גלובליים או אדמינים עם הרשאות מיוחדות.

אפשרות 1: שימוש ב-Azure Cloud Shell

  1. נכנסים לפורטל Azure כאדמינים.
  2. לוחצים על Cloud Shell ואז Powershell.
  3. אם מוצגת בקשה, יוצרים חשבון אחסון ומאשרים את הגדרות ברירת המחדל.
  4. כדי ליצור את האפליקציה, מזינים את הפקודה הבאה ולוחצים על Enter:

    Install-Module Microsoft.Graph -Scope CurrentUser

  5. אם מופיעה בקשה להתקין ממאגר לא מהימן, מזינים Y ואז מקישים על Enter.
  6. מעתיקים את קטע הקוד הבא, מדביקים אותו ב-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 Data Import App)"
    $AppName = if ([string]::IsNullOrWhiteSpace($InputName)) { "Workspace Data Import 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"
    
       
  7. שימו לב לפרטי הכניסה הבאים ושמרו אותם במקום מאובטח. אם פרטי הכניסה יודלפו, האקרים יוכלו לגשת לכל הנתונים שלכם ב-OneDrive או ב-SharePoint Online.
    • סוד לקוח
    • מזהה האפליקציה (אפליקציית הלקוח)
    • מזהה הספרייה (הדייר)

אפשרות 2: שימוש ב-Windows PowerShell

  1. ב-Windows, יוצרים קובץ טקסט פשוט חדש וקוראים לו migration_app_creator.ps1.
  2. מעתיקים את בלוק הקוד הבא, מדביקים אותו בקובץ החדש ולוחצים על 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 Data Import App)"
    $AppName = if ([string]::IsNullOrWhiteSpace($InputName)) { "Workspace Data Import 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"
    
       
  3. שימו לב לפרטי הכניסה הבאים ושמרו אותם במקום מאובטח. אם פרטי הכניסה יודלפו, האקרים יוכלו לגשת לכל הנתונים שלכם ב-OneDrive או ב-SharePoint Online.
    • סוד לקוח
    • מזהה האפליקציה (אפליקציית הלקוח)
    • מזהה הספרייה (הדייר)

שימוש ב-Azure כדי להגדיר חיבור ידני

השלבים הספציפיים של מיקרוסופט עשויים להשתנות בהתאם לגרסה של פורטל Azure ולעדכונים שמיקרוסופט מבצעת. במסמכי התיעוד של מיקרוסופט מפורטות ההנחיות העדכניות ביותר בנושא רישום והרשאה של אפליקציות.

שלב 1: רישום אפליקציה חדשה

  1. נכנסים לפורטל Azure כאדמינים.
  2. ב-Azure Services, עוברים אל App registrations.
  3. לוחצים על New Registration (רישום חדש) ומזינים שם לאפליקציה (לדוגמה, Advanced import app).
  4. בקטע סוגי חשבונות נתמכים, לוחצים על חשבונות בספרייה הארגונית הזו בלבד כדי ליצור אפליקציה לדייר יחיד.
  5. לוחצים על הרשמה.

שלב 2: מגדירים את הרשאות ה-API

בוחרים אחת מהאפשרויות האלה:

אפשרות 1: הוספת הרשאות באופן ידני

  1. בצד, בקטע Manage (ניהול), לוחצים על API permissions (הרשאות API).
  2. לוחצים על Add a permission (הוספת הרשאה) ובכרטיסייה Microsoft APIs (ממשקי API של מיקרוסופט), לוחצים על SharePoint.
  3. לוחצים על Application permissions (הרשאות לאפליקציות) ואז Sites (אתרים) ומסמנים את התיבה Sites.FullControl.All.
  4. לוחצים על הוספת הרשאה.
  5. חוזרים אל Add a permission ולוחצים על Microsoft Graph.
  6. לוחצים על Application permissions ובוחרים את ההרשאות הבאות:
    • LicenseAssignment.Read.All
    • Application.Read.All
  7. לוחצים על הוספת הרשאה.
  8. לוחצים על Grant admin consent for your organization (מתן הסכמה של אדמין לארגון).

אפשרות 2: עריכת המניפסט של האפליקציה

  1. פותחים את המניפסט של האפליקציה.
  2. עוברים אל "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"
                  }
              ]
          }
      ]
         
  3. לוחצים על Grant admin consent for your organization (מתן הסכמה של אדמין לארגון).

שלב 3: יוצרים את סוד הלקוח

  1. בצד, בקטע Manage, לוחצים על Certificates & secrets ואז New client secret.
  2. מזינים תיאור, בוחרים תקופת תפוגה ולוחצים על הוספה.
  3. מעתיקים את Client secret value ושומרים אותו במקום מאובטח. הערך מוצג רק פעם אחת.

שלב 4: אוספים את פרטי הכניסה לאפליקציה

חשוב: צריך לאחסן את פרטי הכניסה של האפליקציה באופן מאובטח. אם פרטי הכניסה יודלפו, האקרים יוכלו לגשת לכל הנתונים שלכם ב-OneDrive או ב-SharePoint Online.

לוחצים על Overview ורושמים במקום בטוח את פרטי הכניסה הבאים:

  • מזהה האפליקציה (אפליקציית הלקוח)
  • מזהה הספרייה (הדייר)

הוספת הרשאות של משתמש-על לייבוא קבצים מוצפנים (בטא)

אם ייבוא הנתונים כולל קבצים מוצפנים, צריך לפעול לפי השלבים הבאים כדי להחיל הרשאות משתמש-על של Microsoft Information Protection‏ (MIP) על מזהה הלקוח של אפליקציית Azure. כדי לפענח קבצים ב-Workspace, הכלי לייבוא הנתונים צריך את ההרשאה AipServiceSuperUser.

צריך לבצע את השלבים הבאים במכשיר Windows שבו נכנסתם לחשבון כאדמין כללי או כאדמין עם הרשאות.

  1. ב-Windows, פותחים את PowerShell ובוחרים באפשרות הפעלה כמנהל מערכת.
  2. כדי להתקין את מודול AIPService, מזינים את הפקודות הבאות ולוחצים על Enter:

    Install-Module -Name AIPService -Scope CurrentUser -Force

    Import-Module AIPService

  3. כדי להתחבר לשירות Azure Information Protection ‏ (AIP), מזינים את הפקודה הבאה ולוחצים על Enter:

    Connect-AipService

  4. כדי להוסיף הרשאות AipServiceSuperUser למזהה הלקוח, מזינים את הפקודה הבאה ומקישים על Enter:

    Add -AipServiceSuperUser -ServicePrincipalId "*application-client-id*"

  5. (אופציונלי) כדי לוודא שסטטוס משתמש-העל מופעל, מזינים את הפקודה הבאה ולוחצים על Enter:

    Get-AipServiceSuperUserFeature

  6. (אופציונלי) כדי לראות לאילו אפליקציות יש גישת משתמש-על, מזינים את הפקודה הבאה ולוחצים על Enter:

    Get-AipServiceSuperUser


‫Google‏, Google Workspace וסימנים וסמלי לוגו קשורים הם סימנים מסחריים של Google LLC. כל שמות החברות והמוצרים האחרים הם סימנים מסחריים של החברות שאליהן הם משויכים.