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
Przejdź do centrum administracyjne Microsoft Entra>Aplikacje>Rejestracje aplikacji.
Na stronie Rejestracje aplikacji wybierz pozycję Nowe rejestracje.
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.
Dodawanie uprawnienia interfejs Graph API do aplikacji
Na stronie Uprawnień interfejsu API żądań nowej aplikacji dodaj uprawnienie Sites.Read.All.
Następnie przyznaj zgodę 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.
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.
Po wykonaniu skryptu nowe wersje raportów są tworzone z dodanymi adresami URL witryny.
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