Uso de PowerShell para resolver direcciones URL del sitio en informes
En este artículo se explica cómo usar PowerShell para mostrar direcciones URL de sitio en informes.
Cómo funciona
El Graph API proporciona una API que le permite enumerar todos los sitios de una organización. Para usar esta API, debe tener una aplicación con el permiso Sites.Read.All.
El script invoca este punto de conexión de API para obtener la asignación entre los identificadores de sitio y las direcciones URL de sitio y, a continuación, agrega las direcciones URL del sitio a los informes CSV exportados.
¿Por qué no usar permisos delegados?
La API /sites/getAllSites solo acepta permisos de aplicación.
La API /sites?search=* acepta permisos delegados, pero no devuelve todos los sitios, incluso con una cuenta de administrador.
Pasos
Para mostrar las direcciones URL del sitio mediante PowerShell, siga estos pasos.
Creación de una aplicación de id. de entra
Vaya a Centro de administración Microsoft Entra>Aplicaciones>Registros de aplicaciones.
En la página Registros de aplicaciones, seleccione Nuevos registros.
Elija un nombre para esta aplicación y use la configuración predeterminada para registrar la aplicación.
Recuerde que el identificador de cliente y el identificador de inquilino se muestran en la sección Essentials de la aplicación.
Agregar Graph API permiso a la aplicación
En la página Solicitar permisos de API de la nueva aplicación, agregue el permiso Sites.Read.All.
A continuación, conceda el consentimiento del administrador.
Creación de un secreto de cliente
En la sección Certificados & secretos de la nueva aplicación, cree un nuevo secreto de cliente. A continuación, almacene el valor del secreto en un lugar seguro y seguro.
Descargue los informes en Centro de administración de Microsoft 365
Descargue el informe de detalles del sitio en las dos páginas del informe y coloque los archivos de informe CSV en una carpeta local.
Antes de descargar los informes, asegúrese de desactivar la configuración de privacidad para los detalles del usuario. Para obtener más información, consulte Centro de administración de Microsoft 365 informes de actividad.
Para el uso del sitio de SharePoint, vaya a la página uso del sitio de SharePoint de la Centro de administración de Microsoft 365.
Para el uso del sitio de OneDrive, vaya a la página de uso del sitio de OneDrive de la Centro de administración de Microsoft 365.
Actualización de los informes con direcciones URL de sitio
Para actualizar los informes con direcciones URL de sitio, ejecute el script de PowerShell.
.\Update-Report.ps1 -**tenantId** {tenant id above} -**clientId** {client id above} -**reportPaths** @("file path for report \#1", "file path for report \#2")
Para ver el script de PowerShell Update-Report completo, consulte PowerShell Update-Report.
El script le pedirá que escriba el valor del secreto creado anteriormente.
Después de ejecutar el script, se crean nuevas versiones de los informes con direcciones URL de sitio agregadas.
Limpieza del entorno
Para limpiar el entorno, vuelva a la página Certificados & secretos de la aplicación y elimine el secreto creado anteriormente.
Sugerencia
Use SSD (unidad de estado sólido) para mejorar el rendimiento de E/S. Ejecute el script en una máquina con suficiente memoria libre o sin usar. La memoria caché tarda aproximadamente 2 GB en los 15 millones de sitios.
Update-Report script de PowerShell
A continuación se muestra el script de PowerShell para 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
}
Preparación de la memoria caché y el secreto de cliente
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
Captura de información del sitio de 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)"
}
Actualización del informe mediante la información del sitio almacenado en caché
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
}
Finalizar
Write-Host
Read-Host "Press any key to exit..."
Opción adicional para escenarios a pequeña escala
En escenarios de menor escala, los administradores con acceso adecuado pueden usar la API REST de SharePoint o Microsoft Graph API para recuperar información sobre los identificadores de sitio a los que se hace referencia en los informes afectados. La API REST de SharePoint se puede usar para recuperar información sobre un identificador de sitio específico.
Por ejemplo, la siguiente solicitud de API REST de SharePoint recupera información sobre el sitio de Contoso con el identificador de sitio 15d43f38-ce4e-4f6b-bac6-766ece1fbcb4:
https://contoso.sharepoint.com/_api/v2.1/sites/contoso.sharepoint.com,15d43f38-ce4e-4f6b-bac6-766ece1fbcb4
Microsoft Graph API se puede usar para enumerar sitios de SharePoint o recuperar información sobre un identificador de sitio específico. Para obtener más información, consulte tipo de recurso de sitio.
Por ejemplo:
https://graph.microsoft.com/v1.0/sites?search=*&$select=sharepointIds
https://graph.microsoft.com/v1.0/sites/{siteId}
Microsoft Graph API también se puede usar para recuperar información sobre el sitio OneDrive para la Empresa de un usuario determinado. Para obtener más información, consulte Tipo de recurso de unidad.
Por ejemplo:
https://graph.microsoft.com/v1.0/users/{userId}/drives?$select=sharepointIds