Как настроить приложение 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. Чтобы создать приложение, введите следующую команду и нажмите Ввод:

    Install-Module Microsoft.Graph -Scope CurrentUser

  5. Если появится запрос на установку из ненадежного хранилища, введите Y > нажмите Ввод.
  6. Скопируйте следующий блок кода, вставьте его в 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 ---
    # 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 (Запустить с помощью 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

Конкретные действия, связанные с продуктом Microsoft, зависят от версии портала Azure и изменений, которые может внести Microsoft. Актуальные инструкции по регистрации и авторизации приложения можно найти в документации Microsoft.

Шаг 1. Зарегистрируйте новое приложение

  1. Войдите на портал Azure как администратор.
  2. В разделе Azure Services (Сервисы Azure) перейдите на страницу App registrations (Регистрация приложений).
  3. Нажмите New Registration (Новая регистрация) и введите название приложения, например "Приложение для расширенного импорта".
  4. В разделе Supported account types (Поддерживаемые типы аккаунтов) нажмите Accounts in this organizational directory only (Только аккаунты в этом каталоге организации), чтобы создать приложение с одним клиентом.
  5. Нажмите Регистрация.

Шаг 2. Настройте разрешения API

Выберите один из вариантов:

Вариант 1. Добавьте разрешения вручную

  1. На боковой панели в разделе Manage (Управление) нажмите API permissions (Разрешения API).
  2. Нажмите Add a permission (Добавить разрешение) и на вкладке Microsoft APIs (API Microsoft) выберите SharePoint.
  3. Нажмите Application permissions (Разрешения приложения) > Sites (Сайты) и установите флажок Sites.FullControl.All.
  4. Нажмите Добавить разрешение.
  5. Вернитесь в раздел Add a permission (Добавить разрешение) и нажмите Microsoft Graph.
  6. Нажмите Разрешения приложения и выберите следующие разрешения:
    • LicenseAssignment.Read.All
    • Application.Read.All
  7. Нажмите Добавить разрешение.
  8. Нажмите Grant admin consent for название организации (Предоставить согласие администратора).

Вариант 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 название организации (Предоставить согласие администратора).

Шаг 3. Создайте секретный код клиента

  1. На боковой панели в разделе Manage (Управление) нажмите Certificates & secrets (Сертификаты и секреты) > New client secret (Новый секретный код клиента).
  2. Введите описание, выберите срок хранения и нажмите Добавить.
  3. Скопируйте значение секретного кода клиента и храните его в надежном месте. Это значение будет показано только один раз.

Шаг 4. Получите учетные данные для приложения

Важно! Храните учетные данные для приложения в надежном месте. В случае их утечки хакеры смогут получить доступ ко всем вашим данным OneDrive или SharePoint Online.

Нажмите Обзор и запишите следующие учетные данные:

  • идентификатор приложения (клиента);
  • идентификатор каталога (клиента).

Как добавить права суперадминистратора для импорта зашифрованных файлов (бета)

Если импортируемые данные включают зашифрованные файлы, выполните описанные ниже действия, чтобы применить права суперпользователя Microsoft Information Protection (MIP) к идентификатору клиента для приложения Azure. Инструменту импорта данных требуется право AipServiceSuperUser для расшифровки файлов в Workspace.

Выполните эти действия на устройстве Windows, войдя в систему как глобальный администратор или администратор привилегированных ролей.

  1. В Windows откройте PowerShell и выберите Запуск от имени администратора.
  2. Чтобы установить модуль AIPService, введите следующие команды и нажмите Ввод:

    Install-Module -Name AIPService -Scope CurrentUser -Force

    Import-Module AIPService

  3. Чтобы подключиться к сервису Azure Information Protection (AIP), введите следующую команду и нажмите Ввод:

    Connect-AipService

  4. Чтобы добавить права AipServiceSuperUser для идентификатора клиента, введите следующую команду и нажмите Ввод:

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

  5. Чтобы убедиться, что у вас есть права суперпользователя, введите следующую команду и нажмите Ввод:

    Get-AipServiceSuperUserFeature

  6. Чтобы посмотреть, у каких приложений есть доступ суперпользователя, введите следующую команду и нажмите Ввод:

    Get-AipServiceSuperUser


Google, Google Workspace и связанные наименования и логотипы являются товарными знаками компании Google LLC. Все другие названия компаний и продуктов являются товарными знаками соответствующих компаний.