2 votes

Impossible de copier des fichiers dans PowerShell à l'aide de PSSession et de la cmdlet Copy-Item sans erreur d'invocation de méthode

J'ai un script PowerShell qui tente de transférer des fichiers d'une ancienne machine vers une nouvelle. Cela se produit sous Windows 10 avec PowerShell v5. Pour cela, je préférerais utiliser PSSession pour transférer des fichiers. Cependant, certains fichiers génèrent l'erreur suivante :

Copy-Item : Method invocation failed because [System.IO.MemoryStream] does not contain a method named 'new'.
At C:\Users\username\Desktop\Import-ComputerData.ps1:153 char:13
+             Copy-Item -Path "C:\users\$UserName\Desktop" -Destination ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], RuntimeException
    + FullyQualifiedErrorId : System.Management.Automation.RuntimeException,WriteException

Voici le code qui en est à l'origine :

    $PSSession = New-PSSession -Computername $ComputerName -ErrorAction SilentlyContinue -ErrorVariable PSSessionError
    ...
    Copy-Item -Path "C:\users\$UserName\Desktop" -Destination "C:\users\$UserName\" -Recurse -FromSession $PSSession -PassThru -Force
    Copy-Item -Path "C:\users\$UserName\Documents" -Destination "C:\users\$UserName\" -Recurse -FromSession $PSSession -PassThru -Force
    Copy-Item -Path "C:\users\$UserName\Favorites" -Destination "C:\users\$UserName\" -Recurse -FromSession $PSSession -PassThru -Force
    Copy-Item -Path "C:\users\$UserName\Pictures" -Destination "C:\users\$UserName\" -Recurse -FromSession $PSSession -PassThru -Force
    Copy-Item -Path "C:\users\$UserName\Downloads" -Destination "C:\users\$UserName\Downloads\Old Downloads" -Recurse -FromSession $PSSession -PassThru -Force
    ...
    Remove-PSSession $PSSession        

Le script est exécuté sur le nouveau PC qui reçoit les fichiers de l'ancienne machine. L'erreur susmentionnée ne se produit que pendant le processus de copie. Je pensais avoir réduit la cause à des fichiers téléchargés à partir d'Internet et devant être "débloqués" car l'ensemble du dossier Téléchargements n'a jamais été transféré.

J'ai essayé d'ajouter le code suivant avant mes cmdlets Copy-Item et j'obtiens toujours les mêmes erreurs :

        Invoke-Command -Session $PSSession -ScriptBlock {
            # This unblocks all internet downloaded files. Only use on trusted files.
            Get-ChildItem "c:\users\$UserName\*" -Recurse | Unblock-File 
        }

Toute idée sur la façon de contourner ce problème serait appréciée.

0voto

wlscaudill Points 1

J'ai écrit un utilitaire pour effectuer cette opération en C# avant que PowerShell ne prenne en charge cette fonction en utilisant le buffer pour envoyer des morceaux du fichier, puis en les réassemblant sur la machine distante par le biais d'appels WinRM. C'est un peu compliqué et je ne l'ai pas testé au-delà de 100 Mo, mais cela fonctionne très bien jusqu'à cette limite. Vous pouvez consulter le fichier C# ici et copier les éléments pertinents de PowerShell et essayer... https://github.com/NaosProject/Naos.WinRM/blob/master/Naos.WinRM/Naos.WinRM.cs

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X