Save to My DOJO
Table of contents
A while back, Eric Siron, one of my fellow Altaro.com bloggers, did an excellent write-up regarding Hyper-V integration services. Said post did a great job explaining the need for integration services, what they are, and how they can help System Admins do their jobs.
As of the Windows Server 2012 R2 release, not much has changed in the realm of Hyper-V Integration Services, but some new functionality has been added, such as the new guest services integration, which allows files to be copied from host to guest via the console connection. No virtual networking in the guest is needed to complete said file transfer. As long as you have an active console session to a defined VM, you can copy a file directly to it from the host system via the GUI.
This is certainly a useful feature, but what happens when you need to copy a file via this methodology, but you don’t have access to a machine with Hyper-V Manager or Failover Cluster Manager? The answer, of course, lies with Powershell!
In this post I will be covering the Powershell cmdlet that provides the file transfer functionality, as well as the cmdlets previously available in Windows Server 2012 (non-R2) that facilitated the management of the various Hyper-V Integration Services features.
PLEASE NOTE: In the below examples I have used the Enter-PSSession cmdlet to Powershell into a Hyper-V host remotely This is in no way a requirement as these commands could easily be executed locally or via RDP on the target system as well. However, I’ve demoed it this way due to the amount of time it would take to run said commands locally on several hosts or guest VMs at once, which is a likely scenario when dealing with Integration Services en-mass across an entire environment. Powershell’s remote session and remote targeting capabilities help cut down the time needed for redundant tasks. Additionally, you’ll see use of the Invoke-Command cmdlet later in this post, which I have utilized for very much the same reason.
Eric will be covering Hyper-V management with Powershell’s remote management features in more depth in an upcoming post for those interested.
Integration Service Management
There are 3 cmdlets provided in the Hyper-V powershell module that gives us what we need to start, stop and review the status of existing Hyper-V Integration Services.
First off, we need to list what exactly those command are. Knowing they are Hyper-V functions, and therefore present in the Hyper-V Powershell module, I would issue:
Get-Command –Module Hyper-V -Name *integration*
Which will return the below:
With that in mind, If I want to return a listing of the current Integration Service status on several VMs that reside on the current host, I would just run:
Get-VMIntegrationService –VMName <VM Names in comma separated list>
As you can see in the example above, I’ve queried two virtual machines for Integration Services status. From this screenshot we can see several items.
- All Integration Services are enabled on both VMs with the exception of the Guest Service Interface, which is the new Server 2012 R2 service that provides the console based file transfers. We’ll enable this shortly.
- I can also see, that all services are healthy with the exception of the 3 labeled No Contact. This is usually caused by a windows service being stopped on the target guest machine.
I can run the below command to get a status of the associated Windows services that correspond to the 3 Integrations we suspect to be in a stopped state above:
Invoke-Command –ComputerName <Hostname> -Credential <Domain><Username> -Scriptblock {Get-Service -Name vmi*}
We see that, as suspected, the needed services are not in a running state. We can utilize a very similar command to start them:
Invoke-Command –ComputerName <Hostname> -Credential <Domain><Username> -Scriptblock {Start-Service -Name <comma separated service names>}
Once I’ve started the services again, running the below will verify whether they are running or not:
Invoke-Command –ComputerName <Hostname> -Credential <Domain><Username> -Scriptblock {Get-Service -Name vmi*}
Followed then by:
Get-VMIntegrationService –VMName <VM Names in comma separated list>
To show us that all integrations are now healthy and functioning normally. (Shown above)
In addition, I’ve found that another good use of the Get-VMIntegrationService cmdlet is to use it to report what Integration services are out of date on a particular VM. This can be done via:
Get-VMIntegrationService –VMName <VM names in comma separated list> | Where-Object {$_.SecondaryOperationalStatus –eq 'ProtocolMismatch'}
This can be especially useful when you need to determine which VMs, out of a vast number of guests, need to have the integrations services package updated.
Going forward if I want to disable one of the integration services I would utilize the Disable-VMIntegrationService cmdlet with the below syntax
Disable-VMIntegrationService –Name <Service Name> -VMName <Target Guest VM Name>
We can see that in the above example that once disabled, the Get-VMIntegrationService cmdlet returns the status of that particular service as false.
To re-enable we use the, yup…. You guessed it, Enable-VMIntegrationService cmdlet!
Enable-VMIntegrationService –Name <Service Name> -VMName <Target Guest VM Name>
And we’re back in business on the Heartbeat service!
Copying Files with Copy-VMFile
So, thus far we’ve seen how to view and manage the various Hyper-V integration services, how do we utilize the new Copy-VMFile cmdlet that was introduced in Windows Server 2012 R2?
First off, we need to enable that particular service. As we can see above the Guest Service Interface service is in a disabled state.
Now that the mentioned service is enabled we can transfer files from host to guest with some relatively easy syntax.
Copy-VMFile “<Name of target Guest VM>” –SourcePath “<Path to file on host system>” –DestinationPath “<Path to new location on guest system>” –CreateFullPath –FileSource Host
Then we browse to the destination and verify that the new directory and file exists!
Summary
As you can see, managing and working with Hyper-V Integration Services via Powershell is no major feat. It’s actually quite simple and intuitive if you have any working knowledge of Powershell. In addition to manual use, these concepts could be incorporated into a script for mass Integration Services maintenance of entire virtual infrastructures, making a seemingly daunting task feel like a walk on easy street.
Thanks for reading!
Not a DOJO Member yet?
Join thousands of other IT pros and receive a weekly roundup email with the latest content & updates!
17 thoughts on "Using Powershell to Manage Hyper-V Integration Services in Server 2012 R2"
Is it possible to Reset Guest OS Administrator password From Host.
In the case of a lost guest administrative password, you would treat that much the same as a physical box. You’ll want to load up a password recovery tool by mounting an ISO to the affected guest VM and boot to it. Otherwise, if you know the current administrative password you would simply log into the guest and change it, or use PowerShell remoting.
Hope this helps!
Thanks!
I need powershell/WMI command that reset pasword Guest OS from Host.
Thanks Agian
Thanks!
I need powershell/WMI command that reset pasword Guest OS from Host.
Thanks Agian
What is the meaning of PrimaryStatusDescription SecondaryStatusDescription fields?
Hello,
I am new to both Powershell and Hyper-V and I use extensively your posts on it, which are extremely helpful. So first of all : THANKS !
I am trying to automate VM provisioning with Powershell.
In order to copy files to a new created VM, I try to enable the Guest Service Interface” as you describe, but I guet the following error:
PS D:VMsscripts> Enable-VMIntegrationService -Name “Guest Service Interface” -VMName “WebServer”
Enable-VMIntegrationService : No integration component with the given name could be found.
At line:1 char:1
Enable-VMIntegrationService -Name “Guest Service Interface” -VMName ” …
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidArgument: (:) [Enable-VMIntegrationService], VirtualizationException
FullyQualifiedErrorId : InvalidParameter,Microsoft.HyperV.PowerShell.Commands.EnableVMIntegrationService
Do you have any idea what I do wrong? thanks!
Hi Joel,
It looks like your question is being reviewed on Altaro’s DoJo Forums: https://dojoforums.altaro.com/topic/enabling-guest-service-interface-with-powershell-invalidargument-error/
Thanks,
Symon Perriman
Altaro Editor