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
Accédez à centre d'administration Microsoft Entra>Applications>inscriptions d'applications.
Dans la page inscriptions d'applications, sélectionnez Nouvelles inscriptions.
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.
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.
Ensuite, accordez le consentement de l’administrateur.
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é.
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.
Après l’exécution du script, de nouvelles versions des rapports sont créées avec des URL de site ajoutées.
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