I am trying to create a script that relates the Drive Letter (i.e. D:\ or E:\ etc) with the USB VID/PID (i.e. "USB\VID_XXXX&PID_XXX\XXXXXXXXXXXXXXX"). I trying searching whole of internet but couldn't find anything promising except the one here: See accepted answer at the top
This answer is able to resolve the issue but I need it in powershell. I have tried converting the code to powershell but its not working I would really appreciate if any help can be provided.
Note: You can get the device InstanceID with below snippet:
#Declaring variable & getting information about all the connected USB devices
$InstanceID = ""
$ConnectedDevices = Get-PnpDevice -Class "USB"
#Applying filter for USB Mass Storage Device and storing the instance ID to be used at later stage
ForEach($USB in $ConnectedDevices)
{
If ($USB.FriendlyName -contains "USB Mass Storage Device")
{
$InstanceID = $USB.DeviceID
}
}
Here is the code that doesn't work (or you can call the failed effort):
$AllDevices = Get-CimInstance -ClassName Win32_USBHub
$InstanceID = "USB\VID_XXXX&PID_XXX\XXXXXXXXXXXXXXX"
$AllProperties
$USBObjects
$SecondIdentity
$AllDrives = Get-CimInstance -ClassName Win32_DiskDrive
Foreach($device in $AllDevices)
{
If($device.DeviceID -like $InstanceID)
{
$AllProperties = $device
}
}
Function FindPath
{
ForEach($DeviceProperty in $AllProperties)
{
If($Device.Description -Contains "*USB Mass Storage Device")
{
$Entity = $Device.DeviceID
ForEach($Controller in $Entity.GetRelated('Win32_USBController'))
{
$USBControllerID = gwmi win32_diskdrive | %{gwmi -Query "ASSOCIATORS OF {Win32_USBController.DeviceID='" + $Controller.DeviceID + "'} WHERE AssocClass = Win32_USBController"}
ForEach($Obj in $USBControllerID)
{
If($Obj -contains "Device ID")
{
$USBObjects = $Obj.DeviceID
$USBObjects
}
}
}
}
$VidPidPosition = $USBObjects.Indexof($Entity)
for($i = $VidPidPosition; $i -le $USBObjects.Count; $i++)
{
if($USBObjects.[i] -contains "USBSTOR")
{
$SecondIdentity = $USBObjects.[i]
}
}
}
}
Function GetDriveLetter
{
FindPath
ForEach($Drive in $AllDrives)
{
If($Drive.PNPDeviceID -eq $SecondIdentity)
{
ForEach($o in $Drive.GetRelated('Win32_DiskPartition'))
{
ForEach($i in $o.GetRelated('Win32_LogicalDisk'))
{
Write-Output "Disk: " $i.Name
}
}
}
}
}
GetDriveLetter
Thanks in advance.