Para poder usar el script debemos:
- Crear un nuevo registro de aplicación desde Microsoft Entra ID https://entra.microsoft.com o desde el portal de Azure https://portal.azure.com . En mi caso lo realice desde el entra.
- Otorgar los permisos de API necesarios a la aplicación que creamos.
- Crear un "Secret Client" para que el script de powershell se pueda autenticar.
- Identificar valores del TenantID, ClientId y ClientSecret
Crear un nuevo registro de aplicación
Si ya tienes una aplicacion con permisos puedes reutilizarla sino vamos a https://entra.microsoft.com ingresamos. Vamos a Aplicaciones\Registro de aplicaciones y hacemos click en nuevo registro
Otorgar los permisos de API
En registro de aplicación vamos a ver la que creamos y procederemos a dar los permisos de API
Los van a ir agregando uno por uno
Así deben de quedar los permisos de API
Los debe de agregar uno por uno las Delegadas y Aplicacion, les hare unas de ejemplos pero deben de dar todas las que se indican anteriomente.
Para GRAPH
TenantID
Lo encuentran en el inicio del portal del Entra
En la seccion de aplicaciones\ Registro de aplicaciones Bsucas la aplicacion RESPALDO_ONDRIVE y en Informacion general ClientID
ClientSecret
En la seccion de aplicaciones\ Registro de aplicaciones Bsucas la aplicacion RESPALDO_ONDRIVE y en Certificados y secretos, pestaña Secretos de los clientes procederemos a crear un nuevo screto de cliente.
Script PowerShell descarga contenido OneDrive
#Elaborado por Victor Endara #Descargar el contenido de OneDrive cuenta Epresarial # Variables de configuracion $TenantId = "TU_TENAN" $ClientId = "TU_CLIENTE_ID" $ClientSecret = "TU_CLIENT_SECRET" $UserPrincipalName = "cuenta@dominio.com" #cuenta empresarial a descargar el contenido $DestinationPath = "D:\Respaldos" #Ruta de respaldo $LogPath = "D:\Respaldos\OneDriveBackupLog.txt" #Log de los eventos # URL de autenticación $AuthUrl = "https://login.microsoftonline.com/$TenantId/oauth2/v2.0/token" # Crear directorio de destino si no existe if (-Not (Test-Path -Path $DestinationPath)) { New-Item -ItemType Directory -Path $DestinationPath } # Función para registrar mensajes function Write-Log { param ( [string]$Message ) Add-Content -Path $LogPath -Value "$(Get-Date) - $Message" } # Función para descargar archivos y subdirectorios function Download-OneDriveContent { param ( [string]$FolderUrl, [string]$LocalPath ) $response = Invoke-RestMethod -Headers @{Authorization = "Bearer $AccessToken"} -Uri $FolderUrl -Method Get foreach ($item in $response.value) { $downloadUrl = $item.'@microsoft.graph.downloadUrl' $itemName = $item.name #eliminar caracteres especiales #$itemName_0 = $itemName -replace '[^a-zA-Z0-9- _]', '' $itemName_0 = $itemName -replace '\[', '(' $itemName_0 = $itemName_0 -replace '\]', ')' $itemName_0 = $itemName_0 -replace '[^a-zA-Z0-9() -_]', '' $itemLocalPath_0 = Join-Path -Path $LocalPath -ChildPath $itemName_0 # $itemLocalPath = Join-Path -Path $LocalPath -ChildPath $itemName if ($item.folder) { # Crear directorio local if (-Not (Test-Path -Path $itemLocalPath)) { New-Item -ItemType Directory -Path $itemLocalPath } # Descargar contenido del subdirectorio Download-OneDriveContent -FolderUrl "https://graph.microsoft.com/v1.0/drives/$($item.parentReference.driveId)/items/$($item.id)/children" -LocalPath $itemLocalPath } else { if (-Not [string]::IsNullOrEmpty($downloadUrl)) { try { Invoke-RestMethod -Uri "$downloadUrl" -OutFile "$itemLocalPath" Write-Log "Downloaded $itemName successfully to $itemLocalPath." } catch { Write-Log "ERROR downloading $itemName : $_" # VEM segundo intento eliminando caracteres especiales try { Invoke-RestMethod -Uri "$downloadUrl" -OutFile "$itemLocalPath_0" Write-Log "2 Downloaded $itemName successfully to $itemLocalPath_0." }catch { Write-Log "2 ERROR downloading $itemName_0 : $_" } } } else { Write-Log "No download URL for $itemName. Skipping file." Write-Log $Error[0] } } } } try { # Obtener token de acceso $Body = @{ client_id = $ClientId scope = "https://graph.microsoft.com/.default" client_secret = $ClientSecret grant_type = "client_credentials" } $response = Invoke-RestMethod -Method Post -Uri $AuthUrl -ContentType "application/x-www-form-urlencoded" -Body $Body $AccessToken = $response.access_token Write-Log "Access token obtained successfully." # Obtener contenido de OneDrive $RootFolderUrl = "https://graph.microsoft.com/v1.0/users/$UserPrincipalName/drive/root/children" Download-OneDriveContent -FolderUrl $RootFolderUrl -LocalPath $DestinationPath } catch { Write-Log "Error during download: $_" Write-Log $Error[0] }
Listo, lo ejecutas y debería funcionar como a mi!!
No hay comentarios:
Publicar un comentario