Usare PowerShell per risolvere gli URL del sito nei report
Questo articolo illustra come usare PowerShell per visualizzare gli URL del sito nei report.
Come funziona
Il API Graph fornisce un'API che consente di elencare tutti i siti all'interno di un'organizzazione. Per usare questa API, è necessario disporre di un'applicazione con l'autorizzazione Sites.Read.All.
Lo script richiama questo endpoint API per ottenere il mapping tra ID sito e URL del sito e quindi aggiunge gli URL del sito nei report CSV esportati.
Perché non usare le autorizzazioni delegate?
L'API /sites/getAllSites accetta solo le autorizzazioni dell'applicazione.
L'API /sites?search=* accetta autorizzazioni delegate, ma non restituisce tutti i siti, nemmeno usando un account amministratore.
Procedura
Per visualizzare gli URL del sito tramite PowerShell, seguire questa procedura.
Creare un'applicazione Entra ID
Passare a Interfaccia di amministrazione di Microsoft Entra>Applicazioni>Registrazioni app.
Nella pagina Registrazioni app selezionare Nuove registrazioni.
Selezionare un nome per l'applicazione e usare la configurazione predefinita per registrare l'app.
Tenere presente che l'ID client e l'ID tenant vengono visualizzati nella sezione Essentials dell'app.
Aggiungere API Graph autorizzazione all'app
Nella pagina Richiedi autorizzazioni API della nuova applicazione aggiungere l'autorizzazione Sites.Read.All.
Concedere quindi il consenso amministratore.
Creare un segreto client
Nella sezione Certificati & segreti della nuova applicazione creare un nuovo segreto client. Archiviare quindi il valore del segreto in un luogo sicuro e sicuro.
Scaricare i report in interfaccia di amministrazione di Microsoft 365
Scaricare il report dei dettagli del sito nelle due pagine del report e inserire i file del report CSV in una cartella locale.
Prima di scaricare i report, assicurarsi di disattivare l'impostazione di privacy per i dettagli dell'utente. Per informazioni dettagliate, vedere interfaccia di amministrazione di Microsoft 365 report attività.
Per l'utilizzo del sito di SharePoint, passare alla pagina di utilizzo del sito di SharePoint nella interfaccia di amministrazione di Microsoft 365.
Per l'utilizzo del sito di OneDrive, passare alla pagina di utilizzo del sito di OneDrive nel interfaccia di amministrazione di Microsoft 365.
Aggiornare i report con GLI URL del sito
Per aggiornare i report con gli URL del sito, eseguire lo script di PowerShell.
.\Update-Report.ps1 -**tenantId** {tenant id above} -**clientId** {client id above} -**reportPaths** @("file path for report \#1", "file path for report \#2")
Per visualizzare l'intero Update-Report script di PowerShell, vedere Update-Report PowerShell.
Lo script richiederà di immettere il valore del segreto creato in precedenza.
Dopo aver eseguito lo script, vengono create nuove versioni dei report con gli URL del sito aggiunti.
Pulire l'ambiente
Per pulire l'ambiente, tornare alla pagina Certificati & segreti dell'applicazione ed eliminare il segreto creato in precedenza.
Consiglio
Usare SSD (Solid State Drive) per migliorare le prestazioni di I/O. Eseguire lo script in un computer con memoria disponibile o inutilizzata sufficiente. La cache richiede circa 2 GB per i 15 milioni di siti.
Update-Report script di PowerShell
Di seguito è riportato lo script di PowerShell per 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
}
Preparare la cache e il segreto 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
Recuperare informazioni sul sito da 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)"
}
Aggiornare il report usando le informazioni del sito memorizzate nella 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
}
Finalizzare
Write-Host
Read-Host "Press any key to exit..."
Opzione aggiuntiva per scenari su scala ridotta
Per scenari su scala ridotta, gli amministratori con accesso appropriato possono usare l'API REST di SharePoint o Microsoft API Graph per recuperare informazioni sugli ID sito a cui si fa riferimento nei report interessati. L'API REST di SharePoint può essere usata per recuperare informazioni su un ID sito specifico.
Ad esempio, la richiesta API REST di SharePoint seguente recupera informazioni sul sito Contoso con ID sito 15d43f38-ce4e-4f6b-bac6-766ece1fbcb4:
https://contoso.sharepoint.com/_api/v2.1/sites/contoso.sharepoint.com,15d43f38-ce4e-4f6b-bac6-766ece1fbcb4
Microsoft API Graph può essere usato per elencare i siti di SharePoint o recuperare informazioni su un ID sito specifico. Per informazioni dettagliate, vedere Tipo di risorsa del sito.
Ad esempio:
https://graph.microsoft.com/v1.0/sites?search=*&$select=sharepointIds
https://graph.microsoft.com/v1.0/sites/{siteId}
È anche possibile usare microsoft API Graph per recuperare informazioni sul sito OneDrive for Business di un determinato utente. Per informazioni dettagliate, vedere Tipo di risorsa unità.
Ad esempio:
https://graph.microsoft.com/v1.0/users/{userId}/drives?$select=sharepointIds