Utiliser PowerShell pour résoudre les URL de site dans les rapports

Cet article explique comment utiliser PowerShell pour afficher les URL de site dans les rapports.

Mode de fonctionnement

Le API Graph fournit une API qui vous permet de répertorier tous les sites d’un organization. Pour utiliser cette API, vous devez disposer d’une application avec l’autorisation Sites.Read.All.

Le script appelle ce point de terminaison d’API pour obtenir le mappage entre les ID de site et les URL de site, puis ajoute les URL de site dans les rapports CSV exportés.

Pourquoi ne pas utiliser des autorisations déléguées ?

  • L’API /sites/getAllSites accepte uniquement les autorisations d’application.

  • L’API /sites ?search=* accepte les autorisations déléguées, mais elle ne retourne pas tous les sites, même à l’aide d’un compte d’administrateur.

Étapes

Pour afficher les URL de site à l’aide de PowerShell, procédez comme suit.

Créer une application d’ID Entra

  1. Accédez à centre d'administration Microsoft Entra>Applications>inscriptions d'applications.

  2. Dans la page inscriptions d'applications, sélectionnez Nouvelles inscriptions.

  3. Choisissez un nom pour cette application et utilisez la configuration par défaut pour inscrire l’application.

N’oubliez pas que l’ID client et l’ID de locataire sont affichés dans la section Essentials de l’application.

Capture d’écran montrant les champs pour le client et l’ID de champ mis en évidence.

Ajouter API Graph autorisation à l’application

Dans la page Demander des autorisations de l’API de la nouvelle application, ajoutez l’autorisation Sites.Read.All.

Capture d’écran montrant l’autorisation Sites.Read.All sélectionnée.

Ensuite, accordez le consentement de l’administrateur.

Capture d’écran montrant le paramètre accorder le consentement administrateur sélectionné.

Créer une clé secrète client

Dans la section Certificats & secrets de la nouvelle application, créez une clé secrète client. Ensuite, stockez la valeur du secret dans un endroit sûr et sécurisé.

Capture d’écran montrant les étapes de création d’une clé secrète client.

Télécharger les rapports dans Centre d'administration Microsoft 365

Téléchargez le rapport de détails du site sur les deux pages de rapport et placez les fichiers de rapport CSV sous un dossier local.

Avant de télécharger les rapports, veillez à désactiver le paramètre de confidentialité pour les détails de l’utilisateur. Pour plus d’informations, consultez Centre d'administration Microsoft 365 rapports d’activité.

Pour l’utilisation du site SharePoint, accédez à la page Utilisation du site SharePoint dans le Centre d'administration Microsoft 365.

Pour l’utilisation du site OneDrive, accédez à la page Utilisation du site OneDrive dans le Centre d'administration Microsoft 365.

Mettre à jour les rapports avec des URL de site

Pour mettre à jour les rapports avec des URL de site, exécutez le script PowerShell.

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

Pour afficher l’intégralité du script PowerShell Update-Report, consultez Update-Report PowerShell.

Le script vous demande d’entrer la valeur du secret créée ci-dessus.

Capture d’écran montrant la commande PowerShell pour la clé secrète client.

Après l’exécution du script, de nouvelles versions des rapports sont créées avec des URL de site ajoutées.

Capture d’écran montrant la liste des URL de site incluses dans le rapport d’utilisation.

Nettoyer l’environnement

Pour propre l’environnement, revenez à la page Certificats & secrets de l’application et supprimez le secret créé précédemment.

Conseil

Utilisez SSD (Solid State Drive) pour améliorer les performances d’E/S. Exécutez le script sur un ordinateur avec suffisamment de mémoire libre/inutilisée. Le cache prend environ 2 Go pour les 15 millions de sites.

Update-Report script PowerShell

Voici le script PowerShell pour 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
}

Préparer le cache et la clé secrète client

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

Récupérer des informations de site à partir de 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)"
}

Mettre à jour le rapport à l’aide des informations de site mises en cache

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
}

Finaliser

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

Option supplémentaire pour les scénarios à petite échelle

Pour les scénarios à plus petite échelle, les administrateurs disposant d’un accès approprié peuvent utiliser l’API REST SharePoint ou Microsoft API Graph pour récupérer des informations sur les ID de site référencés dans les rapports affectés. L’API REST SharePoint peut être utilisée pour récupérer des informations sur un ID de site spécifique.

Par exemple, la requête d’API REST SharePoint suivante récupère des informations sur le site Contoso avec l’ID de site 15d43f38-ce4e-4f6b-bac6-766ece1fbcb4 :

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

Le API Graph Microsoft peut être utilisé pour répertorier les sites SharePoint ou récupérer des informations sur un ID de site spécifique. Pour plus d’informations, consultez Type de ressource de site.

Par exemple :

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

Le API Graph Microsoft peut également être utilisé pour récupérer des informations sur le site OneDrive Entreprise d’un utilisateur donné. Pour plus d’informations, consultez Type de ressource de lecteur.

Par exemple :

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