Использование PowerShell для разрешения URL-адресов сайтов в отчетах
В этой статье описывается, как использовать PowerShell для отображения URL-адресов сайта в отчетах.
Принципы действия
API Graph предоставляет API, который позволяет выводить список всех сайтов в организации. Чтобы использовать этот API, необходимо иметь приложение с разрешением Sites.Read.All.
Скрипт вызывает эту конечную точку API для получения сопоставления между идентификаторами сайтов и URL-адресами сайта, а затем добавляет URL-адреса сайта в экспортированные отчеты CSV.
Почему бы не использовать делегированные разрешения?
API /sites/getAllSites принимает только разрешения приложения.
API /sites?search=* принимает делегированные разрешения, но не возвращает все сайты, даже используя учетную запись администратора.
Действия
Чтобы отобразить URL-адреса сайта с помощью PowerShell, выполните следующие действия.
Создание приложения Entra ID
Перейдите в раздел Центр администрирования Microsoft Entra>Приложения>Регистрация приложений.
На странице Регистрация приложений выберите Новые регистрации.
Выберите имя для этого приложения и используйте конфигурацию по умолчанию для регистрации приложения.
Помните, что идентификатор клиента и идентификатор клиента отображаются в разделе Основные компоненты приложения.
Добавление разрешения API Graph в приложение
На странице Запроса разрешений API нового приложения добавьте разрешение Sites.Read.All.
Затем предоставьте согласие администратора.
Создание секрета клиента
В разделе Сертификаты & секреты нового приложения создайте секрет клиента. Затем сохраните значение секрета в надежном и безопасном месте.
Скачивание отчетов в Центр администрирования Microsoft 365
Скачайте отчет со сведениями о сайте на двух страницах отчета и поместите CSV-файлы отчетов в локальную папку.
Перед скачиванием отчетов обязательно отключите параметр конфиденциальности для сведений о пользователе. Дополнительные сведения см. в Центр администрирования Microsoft 365 отчетах о действиях.
Чтобы получить сведения об использовании сайта SharePoint, перейдите на страницу использование сайта SharePoint в Центр администрирования Microsoft 365.
Чтобы получить сведения об использовании сайта OneDrive, перейдите на страницу использование сайта OneDrive в Центр администрирования Microsoft 365.
Обновление отчетов с помощью URL-адресов сайта
Чтобы обновить отчеты с помощью URL-адресов сайта, выполните сценарий PowerShell.
.\Update-Report.ps1 -**tenantId** {tenant id above} -**clientId** {client id above} -**reportPaths** @("file path for report \#1", "file path for report \#2")
Полный Update-Report скрипта PowerShell см. в разделе Update-Report PowerShell.
Скрипт предложит ввести значение секрета, созданное выше.
После выполнения скрипта создаются новые версии отчетов с добавленными URL-адресами сайта.
Очистка среды
Чтобы очистить среду, вернитесь на страницу "Сертификаты & секреты " приложения и удалите созданный ранее секрет.
Совет
Используйте SSD (твердотельный накопитель) для повышения производительности операций ввода-вывода. Выполните сценарий на компьютере с достаточным объемом свободной или неиспользуемой памяти. Кэш занимает примерно 2 ГБ для 15 миллионов сайтов.
сценарий PowerShell Update-Report
Ниже приведен скрипт PowerShell для 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
}
Подготовка кэша и секрета клиента
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
Получение сведений о сайте из 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)"
}
Обновление отчета с помощью сведений о кэшированном сайте
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
}
Завершить
Write-Host
Read-Host "Press any key to exit..."
Дополнительный параметр для небольших сценариев
В сценариях меньшего масштаба администраторы с соответствующим доступом могут использовать REST API SharePoint или Microsoft API Graph для получения сведений об идентификаторах сайтов, на которые ссылаются в затронутых отчетах. REST API SharePoint можно использовать для получения сведений об определенном идентификаторе сайта.
Например, следующий запрос REST API SharePoint получает сведения о сайте Contoso с идентификатором сайта 15d43f38-ce4e-4f6b-bac6-766ece1fbcb4:
https://contoso.sharepoint.com/_api/v2.1/sites/contoso.sharepoint.com,15d43f38-ce4e-4f6b-bac6-766ece1fbcb4
Microsoft API Graph можно использовать для вывода списка сайтов SharePoint или получения сведений о конкретном идентификаторе сайта. Дополнительные сведения см. в разделе Тип ресурса сайта.
Например:
https://graph.microsoft.com/v1.0/sites?search=*&$select=sharepointIds
https://graph.microsoft.com/v1.0/sites/{siteId}
Microsoft API Graph также можно использовать для получения сведений о OneDrive для бизнеса сайте конкретного пользователя. Дополнительные сведения см. в разделе Тип ресурса диска.
Пример:
https://graph.microsoft.com/v1.0/users/{userId}/drives?$select=sharepointIds