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

  1. Wechseln Sie zu Microsoft Entra Admin Center>Anwendungen>App-Registrierungen.

  2. Wählen Sie auf der Seite App-Registrierungen Die Option Neue Registrierungen aus.

  3. 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.

Screenshot: Hervorgehobene Felder für Client und Feld-ID

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.

Screenshot: Ausgewählte Berechtigung

Erteilen Sie dann die Administratoreinwilligung.

Screenshot der ausgewählten Einstellung

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.

Screenshot: Schritte zum Erstellen eines neuen geheimen Clientschlüssels

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.

Screenshot: PowerShell-Befehl für den geheimen Clientschlüssel

Nach dem Ausführen des Skripts werden neue Versionen der Berichte mit hinzugefügten Website-URLs erstellt.

Screenshot: Liste der Website-URLs, die im Nutzungsbericht enthalten sind

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