Rozpoznawanie adresów URL witryn w raportach przy użyciu programu PowerShell

W tym artykule opisano sposób używania programu PowerShell do wyświetlania adresów URL witryn w raportach.

Jak to działa

Interfejs Graph API udostępnia interfejs API, który umożliwia wyświetlanie listy wszystkich witryn w organizacji. Aby korzystać z tego interfejsu API, musisz mieć aplikację z uprawnieniem Sites.Read.All.

Skrypt wywołuje ten punkt końcowy interfejsu API w celu pobrania mapowania między identyfikatorami lokacji i adresami URL lokacji, a następnie dodaje adresy URL lokacji do wyeksportowanych raportów CSV.

Dlaczego nie używać uprawnień delegowanych?

  • Interfejs API /sites/getAllSites akceptuje tylko uprawnienia aplikacji.

  • Interfejs API /sites?search=* akceptuje uprawnienia delegowane, ale nie zwraca wszystkich witryn, nawet przy użyciu konta administratora.

Kroki

Aby wyświetlić adresy URL witryny przy użyciu programu PowerShell, wykonaj następujące kroki.

Tworzenie aplikacji entra id

  1. Przejdź do centrum administracyjne Microsoft Entra>Aplikacje>Rejestracje aplikacji.

  2. Na stronie Rejestracje aplikacji wybierz pozycję Nowe rejestracje.

  3. Wybierz nazwę tej aplikacji i użyj konfiguracji domyślnej, aby zarejestrować aplikację.

Pamiętaj, że identyfikator klienta i identyfikator dzierżawy są wyświetlane w sekcji Podstawy aplikacji.

Zrzut ekranu przedstawiający wyróżnione pola dla klienta i identyfikatora pola.

Dodawanie uprawnienia interfejs Graph API do aplikacji

Na stronie Uprawnień interfejsu API żądań nowej aplikacji dodaj uprawnienie Sites.Read.All.

Zrzut ekranu przedstawiający wybrane uprawnienie Sites.Read.All.

Następnie przyznaj zgodę administratora.

Zrzut ekranu przedstawiający wybrane ustawienie udzielania zgody administratora.

Tworzenie wpisu tajnego klienta

W sekcji Certyfikaty & wpisów tajnych nowej aplikacji utwórz nowy wpis tajny klienta. Następnie zapisz wartość wpisu tajnego w bezpiecznym miejscu.

Zrzut ekranu przedstawiający kroki tworzenia nowego wpisu tajnego klienta.

Pobieranie raportów w Centrum administracyjne platformy Microsoft 365

Pobierz raport szczegółów witryny na dwóch stronach raportu i umieść pliki raportów CSV w folderze lokalnym.

Przed pobraniem raportów należy wyłączyć ustawienie prywatności dla szczegółów użytkownika. Aby uzyskać szczegółowe informacje, zobacz Centrum administracyjne platformy Microsoft 365 raporty aktywności.

Aby uzyskać informacje o użyciu witryny programu SharePoint, przejdź do strony użycia witryny programu SharePoint w Centrum administracyjne platformy Microsoft 365.

Aby uzyskać informacje o użyciu witryny usługi OneDrive, przejdź do strony użycia witryny usługi OneDrive w Centrum administracyjne platformy Microsoft 365.

Aktualizowanie raportów przy użyciu adresów URL witryny

Aby zaktualizować raporty przy użyciu adresów URL witryny, wykonaj skrypt programu PowerShell.

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

Aby wyświetlić pełny Update-Report skrypt programu PowerShell, zobacz Update-Report PowerShell.

Skrypt poprosi o wprowadzenie wartości wpisu tajnego utworzonej powyżej.

Zrzut ekranu przedstawiający polecenie programu PowerShell dla klucza tajnego klienta.

Po wykonaniu skryptu nowe wersje raportów są tworzone z dodanymi adresami URL witryny.

Zrzut ekranu przedstawiający listę adresów URL witryny uwzględnionych w raporcie użycia.

Oczyszczanie środowiska

Aby wyczyścić środowisko, wróć do strony Certyfikaty & wpisów tajnych aplikacji i usuń wcześniej utworzony wpis tajny.

Porada

Użyj dysków SSD (Solid State Drive), aby zwiększyć wydajność operacji we/wy. Wykonaj skrypt na maszynie z wystarczającą ilością wolnej/nieużywanej pamięci. Pamięć podręczna zajmuje około 2 GB dla 15 milionów witryn.

Update-Report skrypt programu PowerShell

Poniżej przedstawiono skrypt programu PowerShell dla polecenia 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
}

Przygotowywanie pamięci podręcznej i klucza tajnego klienta

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

Pobieranie informacji o witrynie z interfejs 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)"
}

Aktualizowanie raportu przy użyciu informacji o witrynie buforowanej

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

Dodatkowa opcja dla scenariuszy na małą skalę

W przypadku scenariuszy o mniejszej skali administratorzy z odpowiednim dostępem mogą korzystać z interfejsu API REST programu SharePoint lub usługi Microsoft interfejs Graph API do pobierania informacji o identyfikatorach witryn, do których odwołuje się raporty, których dotyczy problem. Interfejs API REST programu SharePoint może służyć do pobierania informacji o określonym identyfikatorze witryny.

Na przykład następujące żądanie interfejsu API REST programu SharePoint pobiera informacje o witrynie firmy Contoso o identyfikatorze witryny 15d43f38-ce4e-4f6b-bac6-766ece1fbcb4:

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

Interfejs Graph API firmy Microsoft może służyć do wyświetlania listy witryn programu SharePoint lub pobierania informacji o określonym identyfikatorze witryny. Aby uzyskać szczegółowe informacje, zobacz typ zasobu witryny.

Przykład:

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

Interfejs Graph API firmy Microsoft może również służyć do pobierania informacji o witrynie OneDrive dla Firm danego użytkownika. Aby uzyskać szczegółowe informacje, zobacz typ zasobu dysku.

Przykład:

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