Transferir todos los archivos de OneDrive a otro usuario a través de PowerShell

Transferir todos los archivos de OneDrive a otro usuario a través de PowerShell

Durante la eliminación de un usuario de Office 365, es posible que deba realizar una copia de sus archivos de OneDrive o transferir la propiedad de los archivos a otra persona. Este puede ser un proceso laborioso, que requiere que inicie sesión en el OneDrive de los usuarios que salen y descargue, transfiera o comparta sus datos manualmente. La buena noticia es que podemos hacer esto con PowerShell. El siguiente script hace que sea relativamente fácil copiar todo el directorio OneDrive de un usuario en una subcarpeta en el OneDrive de otro usuario. La mala noticia es que hay algunas cosas que debe considerar antes de usarlo:

 

Cosas a tener en cuenta

  • Esto podría tomar un tiempo.
    Cada archivo o carpeta tarda al menos uno o dos segundos en procesarse. Si el usuario que sale tiene decenas de miles de archivos y el tiempo no está de su lado, es posible que desee utilizar otro método.
  • Usa su conexión de Internet
    Descarga los archivos antes de subirlos al OneDrive del otro usuario. Si su conexión es lenta y está moviendo archivos grandes, es posible que desee dejarlo ejecutándose en un servidor alojado en la nube.
  • No puede mover archivos de más de 250 MB
    Una limitación de este módulo de PowerShell es que no puede enviar archivos de más de 250 MB a SharePoint. Este script tomará nota de estos archivos y exportará una lista de ellos a C:\Temp\ largefiles.txt en caso de que desee moverlos manualmente.
  • Sin autenticación de dos factores
    Esta secuencia de comandos no funciona con la autenticación multifactor en la cuenta de administrador. Es posible que desee crear un administrador temporal sin MFA para este propósito.

 

Prerrequisitos

Para que este script funcione, deberá instalar los siguientes módulos de PowerShell:

Shell de administración de SharePoint Online
El Shell de administración de SharePoint Online se usa para modificar los permisos en las colecciones de sitios de OneDrive de los usuarios. Descárguelo e instálelo aquí: https://www.microsoft.com/en-au/download/details.aspx?id=35588

Módulo Powershell de SharePoint PnP
El módulo SharePoint PnP Powershell proporciona los cmdlets que usaremos para transferir los archivos y carpetas entre cuentas de OneDrive.

Para instalarlo, abra una ventana de PowerShell como administrador y ejecute el siguiente cmdlet:

Install-Module SharePointPnPPowerShellOnline -Force

 

Módulo Powershell MSOnline V1
También necesitará el módulo PowerShell de MSOnline V1 para este script. Para instalarlo, abra una ventana de PowerShell como administrador y ejecute el siguiente cmdlet:

Install-Module MSOnline -Force

 

Cómo copiar archivos de OneDrive entre usuarios a través de PowerShell

  1. Abra Visual Studio Code o PowerShell ISE y copie y pegue el script al final de este artículo.
  2. Ejecútelo presionando F5 Siga las indicaciones e ingrese la siguiente información:
    El nombre de usuario del usuario saliente. Este es el usuario cuyo OneDrive copiaremos.
    El nombre de usuario del usuario de destino. Este es el usuario que recibirá los archivos de OneDrive en una subcarpeta dentro de su OneDrive
    El nombre de usuario de su administrador de Office 365. Ingrese los detalles para la transferencia de OneDrive
  3. El script buscará archivos demasiado grandes para transferirlos. Si hay alguno, sus detalles se registrarán en C: \Temp\largefiles.txt
  4. Espere a que se creen las carpetas y los archivos. Las carpetas se crean primero, de modo que el cmdlet Copy-PnPFile tenga una ruta existente para colocar los archivos. Espere a que los archivos de OneDrive se copien entre usuarios
  5. Una vez hecho esto, encontrará los archivos y carpetas en el OneDrive de los usuarios de destino en una subcarpeta llamada archivos de "Usuario saliente". Donde Usuario saliente es el nombre para mostrar del usuario que se va.

Script completo de PowerShell para transferir datos de OneDrive a otro usuario

$departinguser = Read-Host "Enter departing user's email"
$destinationuser = Read-Host "Enter destination user's email"
$globaladmin = Read-Host "Enter the username of your Global Admin account"
$credentials = Get-Credential -Credential $globaladmin
Connect-MsolService -Credential $credentials

$InitialDomain = Get-MsolDomain | Where-Object {$_.IsInitial -eq $true}

$SharePointAdminURL = "https://$($InitialDomain.Name.Split(".")[0])-admin.sharepoint.com"

$departingUserUnderscore = $departinguser -replace "[^a-zA-Z]", "_"
$destinationUserUnderscore = $destinationuser -replace "[^a-zA-Z]", "_"

$departingOneDriveSite = "https://$($InitialDomain.Name.Split(".")[0])-my.sharepoint.com/personal/$departingUserUnderscore"
$destinationOneDriveSite = "https://$($InitialDomain.Name.Split(".")[0])-my.sharepoint.com/personal/$destinationUserUnderscore"
Write-Host "`nConnecting to SharePoint Online" -ForegroundColor Blue
Connect-SPOService -Url $SharePointAdminURL -Credential $credentials

Write-Host "`nAdding $globaladmin as site collection admin on both OneDrive site collections" -ForegroundColor Blue
# Set current admin as a Site Collection Admin on both OneDrive Site Collections
Set-SPOUser -Site $departingOneDriveSite -LoginName $globaladmin -IsSiteCollectionAdmin $true
Set-SPOUser -Site $destinationOneDriveSite -LoginName $globaladmin -IsSiteCollectionAdmin $true

Write-Host "`nConnecting to $departinguser's OneDrive via SharePoint Online PNP module" -ForegroundColor Blue

Connect-PnPOnline -Url $departingOneDriveSite -Credentials $credentials

Write-Host "`nGetting display name of $departinguser" -ForegroundColor Blue
# Get name of departing user to create folder name.
$departingOwner = Get-PnPSiteCollectionAdmin | Where-Object {$_.loginname -match $departinguser}

# If there's an issue retrieving the departing user's display name, set this one.
if ($departingOwner -contains $null) {
$departingOwner = @{
Title = "Departing User"
}
}

# Define relative folder locations for OneDrive source and destination
$departingOneDrivePath = "/personal/$departingUserUnderscore/Documents"
$destinationOneDrivePath = "/personal/$destinationUserUnderscore/Documents/$($departingOwner.Title)'s Files"
$destinationOneDriveSiteRelativePath = "Documents/$($departingOwner.Title)'s Files"

Write-Host "`nGetting all items from $($departingOwner.Title)" -ForegroundColor Blue
# Get all items from source OneDrive
$items = Get-PnPListItem -List Documents -PageSize 1000

$largeItems = $items | Where-Object {[long]$_.fieldvalues.SMTotalFileStreamSize -ge 261095424 -and $_.FileSystemObjectType -contains "File"}
if ($largeItems) {
$largeexport = @()
foreach ($item in $largeitems) {
$largeexport += "$(Get-Date) - Size: $([math]::Round(($item.FieldValues.SMTotalFileStreamSize / 1MB),2)) MB Path: $($item.FieldValues.FileRef)"
Write-Host "File too large to copy: $($item.FieldValues.FileRef)" -ForegroundColor DarkYellow
}
$largeexport | Out-file C:\temp\largefiles.txt -Append
Write-Host "A list of files too large to be copied from $($departingOwner.Title) have been exported to C:\temp\LargeFiles.txt" -ForegroundColor Yellow
}

$rightSizeItems = $items | Where-Object {[long]$_.fieldvalues.SMTotalFileStreamSize -lt 261095424 -or $_.FileSystemObjectType -contains "Folder"}

Write-Host "`nConnecting to $destinationuser via SharePoint PNP PowerShell module" -ForegroundColor Blue
Connect-PnPOnline -Url $destinationOneDriveSite -Credentials $credentials

Write-Host "`nFilter by folders" -ForegroundColor Blue
# Filter by Folders to create directory structure
$folders = $rightSizeItems | Where-Object {$_.FileSystemObjectType -contains "Folder"}

Write-Host "`nCreating Directory Structure" -ForegroundColor Blue
foreach ($folder in $folders) {
$path = ('{0}{1}' -f $destinationOneDriveSiteRelativePath, $folder.fieldvalues.FileRef).Replace($departingOneDrivePath, '')
Write-Host "Creating folder in $path" -ForegroundColor Green
$newfolder = Resolve-PnPFolder -SiteRelativePath $path
}


Write-Host "`nCopying Files" -ForegroundColor Blue
$files = $rightSizeItems | Where-Object {$_.FileSystemObjectType -contains "File"}
$fileerrors = ""
foreach ($file in $files) {

$destpath = ("$destinationOneDrivePath$($file.fieldvalues.FileDirRef)").Replace($departingOneDrivePath, "")
Write-Host "Copying $($file.fieldvalues.FileLeafRef) to $destpath" -ForegroundColor Green
$newfile = Copy-PnPFile -SourceUrl $file.fieldvalues.FileRef -TargetUrl $destpath -OverwriteIfAlreadyExists -Force -ErrorVariable errors -ErrorAction SilentlyContinue
$fileerrors += $errors
}
$fileerrors | Out-File c:\temp\fileerrors.txt

# Remove Global Admin from Site Collection Admin role for both users
Write-Host "`nRemoving $globaladmin from OneDrive site collections" -ForegroundColor Blue
Set-SPOUser -Site $departingOneDriveSite -LoginName $globaladmin -IsSiteCollectionAdmin $false
Set-SPOUser -Site $destinationOneDriveSite -LoginName $globaladmin -IsSiteCollectionAdmin $false
Write-Host "`nComplete!" -ForegroundColor Green

 

Como siempre esperamos que este artículo sea de utilidad y si tiene algún contratiempo contáctenos para poder ayudarle en el proceso.

    • Related Articles

    • Restauración de un OneDrive eliminado

      Al eliminar un usuario de la Centro de administración de Microsoft 365 (o cuando se quita un usuario mediante la sincronización de Active Directory), el OneDrive del usuario se conservará durante el número de días que especifique en el Centro de ...
    • Cómo eliminar la invitación del calendario de un usuario eliminado para todos los destinatarios con PowerShell

      Podríamos usar el comando Search-Mailbox para satisfacer esta necesidad, eliminar todas las reuniones recurrentes creadas por el usuario y eliminarlas de los asistentes. Get-Mailbox -ResultSize Unlimited | Search-Mailbox -SearchQuery "kind:meetings ...
    • Módulo Exchange Online PowerShell V2

      El módulo Exchange Online PowerShell V2 (abreviado como el módulo EXO V2) permite que los administradores se conecten a su entorno de Exchange online en Office 365 para recuperar datos, crear nuevos objetos, actualizar objetos existentes, quitar ...
    • Cambio Masivo de Licencias en Office 365 con PowerShell

      En el siguiente artículo veremos como podemos realizar un cambio masivo de licencias en Office 365 a usuarios existentes. Para esto primero debemos de considerar cuales son los SKU's que existen en Office 365 en el Tenant que vamos a afectar y lo ...
    • Cambiar la restricción de mensajes en Exchange Online con PowerShell

      En este artículo mostraremos como podemos realizar el cambio del tamaño de mensaje que se envía o recibe en Exchange Online. Recordaremos que el tamaño máximo que se puede fijar será de 150MB y este procedimiento aplica para cuentas que tienen más de ...