Verwenden von PowerShell zum Auflösen von Website-URLs in Berichten
In diesem Artikel wird beschrieben, wie Sie PowerShell verwenden, um Website-URLs in Berichten anzuzeigen.
So funktioniert es
Die Graph-API stellt eine API bereit, mit der Sie alle Websites innerhalb eines organization auflisten können. Um diese API verwenden zu können, benötigen Sie eine Anwendung mit der Berechtigung Sites.Read.All.
Das Skript ruft diesen API-Endpunkt auf, um die Zuordnung zwischen Website-IDs und Website-URLs abzurufen, und fügt die Website-URLs dann den exportierten CSV-Berichten hinzu.
Warum nicht delegierte Berechtigungen verwenden?
Die API /sites/getAllSites akzeptiert nur Anwendungsberechtigungen.
Die /sites?search=*-API akzeptiert delegierte Berechtigungen, gibt jedoch nicht alle Websites zurück, auch wenn ein Administratorkonto verwendet wird.
Schritte
Führen Sie die folgenden Schritte aus, um Website-URLs mithilfe von PowerShell anzuzeigen.
Erstellen einer Entra ID-Anwendung
Wechseln Sie zu Microsoft Entra Admin Center>Anwendungen>App-Registrierungen.
Wählen Sie auf der Seite App-Registrierungen Die Option Neue Registrierungen aus.
Wählen Sie einen Namen für diese Anwendung aus, und verwenden Sie die Standardkonfiguration, um die App zu registrieren.
Denken Sie daran, dass die Client-ID und die Mandanten-ID im Abschnitt Essentials der App angezeigt werden.
Hinzufügen Graph-API Berechtigung zur App
Fügen Sie auf der Seite API-Berechtigungen anfordern der neuen Anwendung die Berechtigung Sites.Read.All hinzu.
Erteilen Sie dann die Administratoreinwilligung.
Erstellen eines geheimen Clientschlüssels
Erstellen Sie im Abschnitt Zertifikate & Geheimnisse der neuen Anwendung einen neuen geheimen Clientschlüssel. Speichern Sie dann den Wert des Geheimnisses an einem sicheren Ort.
Laden Sie die Berichte in Microsoft 365 Admin Center herunter.
Laden Sie den Websitedetailsbericht auf den beiden Berichtsseiten herunter, und legen Sie die CSV-Berichtsdateien in einem lokalen Ordner ab.
Stellen Sie vor dem Herunterladen der Berichte sicher, dass Sie die Datenschutzeinstellung für Benutzerdetails deaktivieren. Weitere Informationen finden Sie unter Microsoft 365 Admin Center Aktivitätsberichte.
Wechseln Sie zur SharePoint-Websitenutzungsseite im Microsoft 365 Admin Center.
Wechseln Sie zur OneDrive-Websitenutzungsseite im Microsoft 365 Admin Center.
Aktualisieren der Berichte mit Website-URLs
Führen Sie das PowerShell-Skript aus, um die Berichte mit Website-URLs zu aktualisieren.
.\Update-Report.ps1 -**tenantId** {tenant id above} -**clientId** {client id above} -**reportPaths** @("file path for report \#1", "file path for report \#2")
Informationen zum Anzeigen des vollständigen Update-Report PowerShell-Skripts finden Sie unter Update-Report PowerShell.
Das Skript fordert Sie auf, den oben erstellten Wert des Geheimnisses einzugeben.
Nach dem Ausführen des Skripts werden neue Versionen der Berichte mit hinzugefügten Website-URLs erstellt.
Bereinigen der Umgebung
Um die Umgebung zu sauber, wechseln Sie zurück zur Seite Zertifikate & Geheimnisse der Anwendung, und löschen Sie das zuvor erstellte Geheimnis.
Tipp
Verwenden Sie SSD (Solid State Drive), um die E/A-Leistung zu verbessern. Führen Sie das Skript auf einem Computer mit genügend freiem/ungenutztem Arbeitsspeicher aus. Der Cache benötigt ungefähr 2 GB für die 15 Millionen Websites.
Update-Report PowerShell-Skript
Im Folgenden finden Sie das PowerShell-Skript für 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
}
Vorbereiten des Caches und des geheimen Clientschlüssels
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
Abrufen von Websiteinformationen aus Graph-API
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)"
}
Aktualisieren des Berichts mithilfe von zwischengespeicherten Websiteinformationen
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
}
Finalize
Write-Host
Read-Host "Press any key to exit..."
Zusätzliche Option für kleine Szenarien
In Szenarien mit kleinerem Umfang können Administratoren mit entsprechendem Zugriff die SharePoint-REST-API oder microsoft Graph-API verwenden, um Informationen zu Website-IDs abzurufen, auf die in den betroffenen Berichten verwiesen wird. Die SharePoint-REST-API kann verwendet werden, um Informationen zu einer bestimmten Website-ID abzurufen.
Die folgende SharePoint-REST-API-Anforderung ruft beispielsweise Informationen zur Contoso-Website mit der Website-ID 15d43f38-ce4e-4f6b-bac6-766ece1fbcb4 ab:
https://contoso.sharepoint.com/_api/v2.1/sites/contoso.sharepoint.com,15d43f38-ce4e-4f6b-bac6-766ece1fbcb4
Die Microsoft Graph-API kann verwendet werden, um SharePoint-Websites aufzulisten oder Informationen zu einer bestimmten Website-ID abzurufen. Weitere Informationen finden Sie unter Standortressourcentyp.
Zum Beispiel:
https://graph.microsoft.com/v1.0/sites?search=*&$select=sharepointIds
https://graph.microsoft.com/v1.0/sites/{siteId}
Die Microsoft Graph-API kann auch verwendet werden, um Informationen über die OneDrive for Business Website eines bestimmten Benutzers abzurufen. Weitere Informationen finden Sie unter Laufwerkressourcentyp.
Beispiel:
https://graph.microsoft.com/v1.0/users/{userId}/drives?$select=sharepointIds