Использование PowerShell для разрешения URL-адресов сайтов в отчетах

В этой статье описывается, как использовать PowerShell для отображения URL-адресов сайта в отчетах.

Принципы действия

API Graph предоставляет API, который позволяет выводить список всех сайтов в организации. Чтобы использовать этот API, необходимо иметь приложение с разрешением Sites.Read.All.

Скрипт вызывает эту конечную точку API для получения сопоставления между идентификаторами сайтов и URL-адресами сайта, а затем добавляет URL-адреса сайта в экспортированные отчеты CSV.

Почему бы не использовать делегированные разрешения?

  • API /sites/getAllSites принимает только разрешения приложения.

  • API /sites?search=* принимает делегированные разрешения, но не возвращает все сайты, даже используя учетную запись администратора.

Действия

Чтобы отобразить URL-адреса сайта с помощью PowerShell, выполните следующие действия.

Создание приложения Entra ID

  1. Перейдите в раздел Центр администрирования Microsoft Entra>Приложения>Регистрация приложений.

  2. На странице Регистрация приложений выберите Новые регистрации.

  3. Выберите имя для этого приложения и используйте конфигурацию по умолчанию для регистрации приложения.

Помните, что идентификатор клиента и идентификатор клиента отображаются в разделе Основные компоненты приложения.

Снимок экрана: выделенные поля для клиента и идентификатора поля.

Добавление разрешения API Graph в приложение

На странице Запроса разрешений API нового приложения добавьте разрешение Sites.Read.All.

Снимок экрана: выбранное разрешение Sites.Read.All.

Затем предоставьте согласие администратора.

Снимок экрана: выбранный параметр предоставления согласия администратора.

Создание секрета клиента

В разделе Сертификаты & секреты нового приложения создайте секрет клиента. Затем сохраните значение секрета в надежном и безопасном месте.

Снимок экрана: действия по созданию секрета клиента.

Скачивание отчетов в Центр администрирования Microsoft 365

Скачайте отчет со сведениями о сайте на двух страницах отчета и поместите CSV-файлы отчетов в локальную папку.

Перед скачиванием отчетов обязательно отключите параметр конфиденциальности для сведений о пользователе. Дополнительные сведения см. в Центр администрирования Microsoft 365 отчетах о действиях.

Чтобы получить сведения об использовании сайта SharePoint, перейдите на страницу использование сайта SharePoint в Центр администрирования Microsoft 365.

Чтобы получить сведения об использовании сайта OneDrive, перейдите на страницу использование сайта OneDrive в Центр администрирования Microsoft 365.

Обновление отчетов с помощью URL-адресов сайта

Чтобы обновить отчеты с помощью URL-адресов сайта, выполните сценарий PowerShell.

.\Update-Report.ps1 -**tenantId** {tenant id above} -**clientId** {client id above} -**reportPaths** @("file path for report \#1", "file path for report \#2")

Полный Update-Report скрипта PowerShell см. в разделе Update-Report PowerShell.

Скрипт предложит ввести значение секрета, созданное выше.

Снимок экрана: команда PowerShell для секрета клиента.

После выполнения скрипта создаются новые версии отчетов с добавленными URL-адресами сайта.

Снимок экрана: список URL-адресов сайтов, включенных в отчет об использовании.

Очистка среды

Чтобы очистить среду, вернитесь на страницу "Сертификаты & секреты " приложения и удалите созданный ранее секрет.

Совет

Используйте SSD (твердотельный накопитель) для повышения производительности операций ввода-вывода. Выполните сценарий на компьютере с достаточным объемом свободной или неиспользуемой памяти. Кэш занимает примерно 2 ГБ для 15 миллионов сайтов.

сценарий PowerShell Update-Report

Ниже приведен скрипт PowerShell для Update-Report.

 param(
 [Parameter(Mandatory=$true)]
 [string]$tenantId,
 [Parameter(Mandatory=$true)]
 [string]$clientId,
 [Parameter(Mandatory=$false)]
 [string[]]$reportPaths
)

function Get-AccessToken {
 param(
     [Parameter(Mandatory=$true)]
     [string]$tenantId,
     [Parameter(Mandatory=$true)]
     [string]$clientId,
     [Parameter(Mandatory=$true)]
     [System.Security.SecureString]$clientSecret,
     [Parameter(Mandatory=$false)]
     [string]$scope = "https://graph.microsoft.com/.default"
 )

 $tokenEndpoint = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token"
 $tokenRequest = @{
     client_id     = $clientId
     scope         = $scope
     client_secret = ConvertFrom-SecureString $clientSecret -AsPlainText
     grant_type    = "client_credentials"
 }

 $tokenResponse = Invoke-RestMethod -Uri $tokenEndpoint -Method Post -Body $tokenRequest
 return $tokenResponse.access_token
}

Подготовка кэша и секрета клиента

if ($reportPaths.Count -eq 0) {
  Write-Host "Please provide at least one report path" -ForegroundColor Red
  exit
}
$cache = New-Object 'System.Collections.Generic.Dictionary[[String],[String]]'
$clientSecret = Read-Host "Please enter client secret" -AsSecureString

Получение сведений о сайте из API Graph

Write-Host
Write-Host "Getting information for all the sites..." -ForegroundColor Cyan

$uri = "https://graph.microsoft.com/v1.0/sites/getAllSites?`$select=sharepointIds&`$top=10000"
while ($uri -ne $null) {

  Write-Host $uri

  $isSuccess = $false
  while (-not $isSuccess) {
      try {
          $accessToken = Get-AccessToken -tenantId $tenantId -clientId $clientId -clientSecret $clientSecret
          $restParams = @{Headers=@{Authorization="Bearer $accessToken"}}
      }
      catch {
          Write-Host "Retrying...  $($_.Exception.Message)" -ForegroundColor Yellow
          continue
      }
      try {
          $sites = Invoke-RestMethod $uri @restParams
          $isSuccess = $true
      }
      catch {
          if ($_.Exception.Response -and $_.Exception.Response.Headers['Retry-After']) {
              $retryAfter = [int]$_.Exception.Response.Headers['Retry-After']
              Write-Output "Waiting for $retryAfter seconds before retrying..." -ForegroundColor Yellow
              Start-Sleep -Seconds $retryAfter
          }
          Write-Host "Retrying...  $($_.Exception.Message)" -ForegroundColor Yellow
          continue
      }
  }

  $sites.value | ForEach-Object {
      $cache[$_.sharepointIds.siteId] = $_.sharepointIds.siteUrl
  }

  $uri = $sites."@odata.nextLink"

  Write-Host "Total sites received: $($cache.Count)"
}

Обновление отчета с помощью сведений о кэшированном сайте

foreach ($reportPath in $reportPaths) {
  Write-Host
  Write-Host "Updating report $($reportPath) ..." -ForegroundColor Cyan

  $outputPath = "$($reportPath)_$([Math]::Floor((Get-Date -UFormat %s))).csv"
  $writer = [System.IO.StreamWriter]::new($outputPath)
  $reader = [System.IO.StreamReader]::new($reportPath)
  $rowCount = 0

  while ($null -ne ($line = $reader.ReadLine())) {
      $rowCount++

      $columns = $line.Split(",")
      $siteId = $columns[1]

      $_guid = New-Object System.Guid
      if ([System.Guid]::TryParse($siteId, [ref]$_guid)) {
          $siteUrl = $cache[$siteId]
          $columns[2] = $siteUrl
          $line = $columns -join ","
      }
      
      $writer.WriteLine($line)

      if ($rowCount%1000 -eq 0) {
          Write-Host "Processed $($rowCount) rows"
      }
  }
  $writer.Close()
  $reader.Close()

  Write-Host "Processed $($rowCount) rows"
  Write-Host "Report updated: $($outputPath)" -ForegroundColor Cyan
}

Завершить

Write-Host
Read-Host "Press any key to exit..."

Дополнительный параметр для небольших сценариев

В сценариях меньшего масштаба администраторы с соответствующим доступом могут использовать REST API SharePoint или Microsoft API Graph для получения сведений об идентификаторах сайтов, на которые ссылаются в затронутых отчетах. REST API SharePoint можно использовать для получения сведений об определенном идентификаторе сайта.

Например, следующий запрос REST API SharePoint получает сведения о сайте Contoso с идентификатором сайта 15d43f38-ce4e-4f6b-bac6-766ece1fbcb4:

https://contoso.sharepoint.com/_api/v2.1/sites/contoso.sharepoint.com,15d43f38-ce4e-4f6b-bac6-766ece1fbcb4

Microsoft API Graph можно использовать для вывода списка сайтов SharePoint или получения сведений о конкретном идентификаторе сайта. Дополнительные сведения см. в разделе Тип ресурса сайта.

Например:

  • https://graph.microsoft.com/v1.0/sites?search=*&$select=sharepointIds
  • https://graph.microsoft.com/v1.0/sites/{siteId}

Microsoft API Graph также можно использовать для получения сведений о OneDrive для бизнеса сайте конкретного пользователя. Дополнительные сведения см. в разделе Тип ресурса диска.

Пример:

  • https://graph.microsoft.com/v1.0/users/{userId}/drives?$select=sharepointIds