Configurer une application Azure pour OneDrive et SharePoint Online

Pour créer une application Microsoft Azure dans le portail Azure, procédez comme suit. Si vous utilisez la méthode d'importation avancée des données pour copier des données OneDrive ou SharePoint Online (Microsoft 365) vers vos comptes Google Workspace, vous avez besoin de l'application Azure pour assurer une importation sécurisée des données. Vous avez le choix entre deux méthodes :

Utiliser un script PowerShell pour configurer une connexion automatique

Pour effectuer cette procédure, vous devez être un administrateur disposant d'un rôle global ou privilégié.

Option 1 : Utiliser Azure Cloud Shell

  1. En tant qu'administrateur, connectez-vous au portail Azure.
  2. Cliquez sur Cloud Shell puis Powershell.
  3. Si vous y êtes invité, créez un compte de stockage et acceptez les paramètres par défaut.
  4. Pour créer l'application, saisissez la commande suivante, puis cliquez sur Entrée :

    Install-Module Microsoft.Graph -Scope CurrentUser

  5. Si vous êtes invité à installer à partir d'un dépôt non approuvé, saisissez Y, puis cliquez sur Entrée.
  6. Copiez le bloc de code suivant, collez-le dans PowerShell, puis cliquez sur Entrée.
    <#    
    .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. Notez les identifiants suivants et stockez-les de manière sécurisée. Si les identifiants sont divulgués, des pirates informatiques pourraient accéder à toutes vos données OneDrive ou SharePoint Online.
    • Code secret du client
    • ID (client) de l'application
    • ID de l'annuaire (locataire)

Option 2 : Utiliser Windows PowerShell

  1. Sous Windows, créez un fichier texte brut et nommez-le migration_app_creator.ps1.
  2. Copiez le bloc de code suivant, collez-le dans le nouveau fichier, puis cliquez sur Exécuter avec 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. Notez les identifiants suivants et stockez-les de manière sécurisée. Si les identifiants sont divulgués, des pirates informatiques pourraient accéder à toutes vos données OneDrive ou SharePoint Online.
    • Code secret du client
    • ID (client) de l'application
    • ID de l'annuaire (locataire)

Utiliser Microsoft Azure pour configurer une connexion manuelle

Les étapes spécifiques de Microsoft peuvent varier en fonction de la version de votre portail Azure et des mises à jour effectuées par Microsoft. Consultez la documentation de Microsoft pour obtenir les dernières instructions sur l'enregistrement et l'autorisation des applications.

Étape 1 : Enregistrez une application

  1. En tant qu'administrateur, connectez-vous au portail Azure.
  2. Dans les services Azure, accédez à Inscriptions d'applications.
  3. Cliquez sur New Registration (Nouvelle inscription), puis saisissez un nom pour votre application (par exemple, "Advanced import app").
  4. Pour Supported account types (Types de comptes compatibles), cliquez sur Accounts in this organizational directory only (Comptes dans cet annuaire organisationnel uniquement) pour créer une application à locataire unique.
  5. Cliquez sur S'inscrire.

Étape 2 : Configurer les autorisations de l'API

Choisissez l'une des options suivantes :

Option 1 : Ajouter manuellement des autorisations

  1. Sur le côté, dans la section Gérer, cliquez sur Autorisations des API.
  2. Cliquez sur Ajouter une autorisation, puis sur SharePoint dans l'onglet API Microsoft.
  3. Cliquez sur Autorisations de l'application, puis cochez la case Sites.FullControl.All dans le menu déroulant "Sites".
  4. Cliquez sur Ajouter une autorisation.
  5. Revenez à Ajouter une autorisation, puis sélectionnez Microsoft Graph.
  6. Cliquez sur "Autorisations de l'application" et accordez les autorisations suivantes :
    • LicenseAssignment.Read.All
    • Application.Read.All
  7. Cliquez sur Ajouter une autorisation.
  8. Cliquez sur Accorder le consentement administrateur pour votre organisation pour vous assurer que l'application est autorisée à accéder aux données.

Option 2 : Modifier le fichier manifeste de l'application

  1. Ouvrez le fichier manifeste de l'application.
  2. Accédez à "resourceAccess" : [ ] et sélectionnez une option :
    • Si "resourceAccess" : [ ] a déjà une valeur, ajoutez une virgule, puis collez le bloc de code suivant.
    • Si "resourceAccess" : [ ] n'a pas de valeur, copiez et collez le bloc de code suivant.
         "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. Cliquez sur Accorder le consentement administrateur pour votre organisation.

Étape 3 : Générer le code secret du client

  1. Sur le côté, sous Gérer, cliquez sur Certificats et codes secrets puis Nouveau code secret du client.
  2. Saisissez une description, sélectionnez une période d'expiration, puis cliquez sur Ajouter.
  3. Copiez la valeur du code secret du client et stockez-la de manière sécurisée. La valeur n'est affichée qu'une seule fois.

Étape 4 : Collectez les identifiants de l'application

Important : Stockez les identifiants de l'application de manière sécurisée. Si les identifiants sont divulgués, des pirates informatiques pourraient accéder à toutes vos données OneDrive ou SharePoint Online.

Cliquez sur Aperçu et notez les identifiants suivants de manière sécurisée :

  • ID (client) de l'application
  • ID de l'annuaire (locataire)


Google, Google Workspace et les marques et logos associés sont des marques de Google LLC. Tous les autres noms de sociétés et de produits sont des marques des sociétés auxquelles ils sont associés.