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

  1. Vaya a Centro de administración Microsoft Entra>Aplicaciones>Registros de aplicaciones.

  2. En la página Registros de aplicaciones, seleccione Nuevos registros.

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

Captura de pantalla que muestra los campos del identificador de cliente y campo resaltados.

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.

Captura de pantalla que muestra el permiso Sites.Read.All seleccionado.

A continuación, conceda el consentimiento del administrador.

Captura de pantalla que muestra la configuración de consentimiento del administrador de concesión seleccionada.

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.

Captura de pantalla que muestra los pasos para crear un nuevo secreto de cliente.

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.

Captura de pantalla que muestra el comando de PowerShell para el secreto de cliente.

Después de ejecutar el script, se crean nuevas versiones de los informes con direcciones URL de sitio agregadas.

Captura de pantalla que muestra la lista de direcciones URL de sitio incluidas en el informe de uso.

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