Using the PowerShell cmdlet Copy-VMFile
To copy files to a VM using the Copy-VMFile cmdlet, we first have to enable Guest Services under Integration Services for a VM. Luckily, there is a PowerShell one-liner for this:
Enable IntegrationService for Guest
Enable-VMIntegrationService -Name "Guest ServiceInterface" -VMName "WS2019-DC01"
Now we are now ready to copy the file from the host (source) to the guest VM (destination) using the following command:
Copy File from Host To Guest VM
Copy-VMFile "WS2019-DC01" -SourcePath "D:\Test.txt" -DestinationPath "C:\Temp\Test.txt" -CreateFullPath -FileSource Host
However, you cannot use this command when you need to copy files from guest to host. You then need to create a PSSession and then run the command to copy files from guest to host.
Using PSSession for copy file from Guest to Host
<#
Solution: Microsoft Hyper-V Tool
Purpose: Copy from Hyper-V Guest
Version: 2.0.0
Date: 12 March 2021
Author: Tomas Johansson
Twitter: @deploymentnoob
Web: https://www.4thcorner.net
This script is provided "AS IS" with no warranties, confers no rights and
is not supported by the author
#>
# Define a Microsoft .NET Core class in your PowerShell session
Add-Type -AssemblyName Microsoft.VisualBasic
# This command uses the PromptForCredential method to prompt the user for their user name and password.
# The command saves the resulting credentials in the $Credential variable.
$Credential = $Host.UI.PromptForCredential("Need credentials", "Please enter your User name and Password.", "", "NetBiosUserName")
# Server to use the PSSession to
$ConnectToServer = [Microsoft.VisualBasic.Interaction]::InputBox('Input Server to connect to', 'Server Name', "")
# Create new PSSession to Server with specific Credential
$Session = New-PSSession -VMName $ConnectToServer -Credential $Credential
# Start interactive session with single remote computer
Enter-PSSession -Session $Session
# Copy Items from Temp Diretory from remote computer and if file and overwrites existing files
Copy-Item -FromSession $Session -Path "C:\TEMP\*" -Destination "D:\Temp" -Force
# Closes the current session. also closes the connection between the local and remote computers
Remove-PSSession -Session $Session
But how do you make COPY-VMFILE work when copying a file to a VM on another HOST server in like a cluster enviroment. -COMPUTERNAME seems like the solution but I get 80070005 Access denied anytime I point to a different hyper-v host then the one I’m on.
When it works on the local host the Hyper-V event log shows a successful entry from the user “NT VIRTUAL MACHINE\{VM sid}”.
I’m assuming I need to allow some permissions somewhere?