PowerCLI has a function to remove a USB device from a host, Remove-UsbDevice. However, what if you need to add a usb device to a VM.  Well you can with a bit of PowerCLI magic.  This solution assumes the device you wish to add remains in the same USB port and that the VM will be on the same host as the USB device of interest.  If you wish you can hack around to insert the host ID and change from path: option to pid: and vid: options.  You can read more about the option at VMware pubs.

Below is a simple function for Add-UsbDevice. It takes a VM name (wildcard if you know it will be unique for ease) and then the path is normally in the form of BUS/0/DEVICE i.e. “2/0/5”.

1 # 2 # Simple to use once connected to the server of interest (not vCenter) 3 # Set-UsbDevice -Name "My VM Name" -UsbPath "2/0/5" 4 # 5 # Find out the UsbPath from lsusb - typically BUS/0/DEVICE - but not guaranteed! 6 # 7 8 Function Set-UsbDevice 9 { 10 11 # We need both parameters 12 [CmdletBinding()] 13 Param( 14 [Parameter(Mandatory=$True,Position=1)] 15 [string]$Name, 16 17 [Parameter(Mandatory=$True)] 18 [string]$UsbPath 19 ) 20 21 #Get our VM then then ID 22 $VM = Get-VM $Name 23 $Id = $VM.Id 24 25 #Create a new Virtual Machine Configuration Specification 26 $newSpec = New-Object VMware.Vim.VirtualMachineConfigSpec 27 $newSpec.deviceChange = New-Object VMware.Vim.VirtualDeviceConfigSpec[] (1) 28 $newSpec.deviceChange[0] = New-Object VMware.Vim.VirtualDeviceConfigSpec 29 $newSpec.deviceChange[0].operation = "add" 30 $newSpec.deviceChange[0].device = New-Object VMware.Vim.VirtualUSB 31 $newSpec.deviceChange[0].device.key = -100 32 $newSpec.deviceChange[0].device.backing = New-Object VMware.Vim.VirtualUSBUSBBackingInfo 33 $newSpec.deviceChange[0].device.backing.deviceName = "path:$UsbPath host:localhost" 34 $newSpec.deviceChange[0].device.connectable = New-Object VMware.Vim.VirtualDeviceConnectInfo 35 $newSpec.deviceChange[0].device.connectable.startConnected = $true 36 $newSpec.deviceChange[0].device.connectable.allowGuestControl = $false 37 $newSpec.deviceChange[0].device.connectable.connected = $true 38 $newSpec.deviceChange[0].device.connected = $false 39 40 $_this = Get-View -Id "$Id" 41 $_this.ReconfigVM_Task($newSpec) 42 43 }

If you want to find out the path on your host then using the shell you can use lsusb:

~ # lsusb
Bus 02 Device 06: ID 0424:4030 Standard Microsystems Corp.
Bus 02 Device 05: ID 03f0:1fe0 Hewlett-Packard
Bus 02 Device 04: ID 0fde:ca04
Bus 02 Device 03: ID 0424:2660 Standard Microsystems Corp.
Bus 02 Device 02: ID 8087:8000 Intel Corp.
Bus 02 Device 01: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 01 Device 04: ID 0a12:0001 Cambridge Silicon Radio
Bus 01 Device 03: ID 0403:6001 Future Technology Devices
Bus 01 Device 02: ID 8087:8008 Intel Corp.
Bus 01 Device 01: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 03 Device 01: ID 1d6b:0001 Linux Foundation 1.1 root hub

Use the command like this in PowerCLI once you have connected to the Host:

Set-UsbDevice -name "vSphere *" -UsbPath "2/0/5"

Any questions then please leave a comment.


2 thoughts on “Function to Add a USB Device to ESX Host

  1. Hi, I ran this with and the command appears to complete, and no errors are thrown but the USB device is still not available in the VM. I can’t find the location of the configuration file I imagine this creates for the VM to verify the script has made the changes. I have double checked the VM name, bus and device numbers are right so am a little lost now. Any troubleshooting tips?

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.