2024-09-12 23:46:24 +00:00
function Get-DevicesUnplugged {
param (
[ string ] $comp
)
2024-09-18 18:15:13 +00:00
Write-Progress -Activity " Getting devices for $name " -Status 'Collecting USB devices' -PercentComplete 10 -ParentId 1
2024-09-12 23:46:24 +00:00
if ( $comp -eq $env:COMPUTERNAME ) {
$usb + = Get-PnpDevice -Status UNKNOWN | Select-Object @ { N = " Description " ; E = { $_ . FriendlyName } } , @ { N = " DeviceID\SerialNumber " ; E = { $_ . InstanceID } } | Add-Member -NotePropertyName Manufacturer -NotePropertyValue 'Unknown' -PassThru
} else {
$usb + = Invoke-Command -ComputerName $comp -SessionOption $ ( New-PSSessionOption -NoMachineProfile ) -ScriptBlock {
Get-PnpDevice -Status UNKNOWN | Select-Object @ { N = " Description " ; E = { $_ . FriendlyName } } , @ { N = " DeviceID\SerialNumber " ; E = { $_ . InstanceID } } | Add-Member -NotePropertyName Manufacturer -NotePropertyValue 'Unknown' -PassThru
}
}
$usb | Add-Member -NotePropertyName Type -NotePropertyValue USB
$usb | Add-Member -NotePropertyName AttachedComputer -NotePropertyValue $comp
2024-09-18 18:15:13 +00:00
$usbi = 0
2024-09-12 23:46:24 +00:00
foreach ( $item in $usb ) {
2024-09-18 18:15:13 +00:00
$usbi + +
Write-Progress -Activity " Getting devices for $name " -Status " Parsing USB Devices ( $usbi / $( $usb . Length ) " -PercentComplete ( ( $usbi * ( 90 - 10 ) / $usb . Length ) +10 ) -ParentId 1
2024-09-12 23:46:24 +00:00
$friendlyNames = FindUSBDevice -deviceID $item . 'DeviceID\SerialNumber' . ToString ( )
if ( $friendlyNames ) {
$item . Manufacturer = $friendlyNames [ 0 ]
if ( $item . Manufacturer . Length -le 5 ) {
continue
}
if ( $item . Manufacturer . Substring ( 0 , 5 ) -eq '[SHS]' ) {
$item . Type = 'SHS Issued USB'
$len = $item . Manufacturer . Length -1
$item . Manufacturer = $item . Manufacturer [ 5 . . $len ] -join ''
}
if ( $friendlyNames [ 1 ] ) {
$item . Description = $friendlyNames [ 1 ]
}
}
}
2024-09-18 18:15:13 +00:00
Write-Progress -Activity " Getting devices for $name " -Status 'Sorting out duplicate devices' -PercentComplete 90 -ParentId 1
2024-09-12 23:46:24 +00:00
$usb = $usb | Sort-Object Manufacturer , Description
for ( $i = 0 ; $i -lt $usb . Count - 1 ; $i + + ) {
if ( $usb [ $i ] . Manufacturer -eq $usb [ $i + 1 ] . Manufacturer -and $usb [ $i ] . Description -eq $usb [ $i + 1 ] . Description ) {
$usb [ $i ] . Manufacturer = '__DUPE__'
}
}
$usb = $usb | Where-Object -Property Manufacturer -NE '__DUPE__'
$usb = $usb | Sort-Object Type
$out = @ ( )
foreach ( $item in ( $monitors + $usb ) ) {
$item . PSObject . TypeNames . Insert ( 0 , 'GetPC.Devices' )
$out + = $item
}
$item = [ PSCustomObject ] @ { }
$item . PSObject . TypeNames . Insert ( 0 , 'GetPC.Devices' )
$out + = $item
Write-Output $out
}
function FindUSBDevice {
param (
[ string ] $vid ,
[ string ] $p ,
[ string ] $deviceID
)
if ( $deviceID ) {
$bool = $deviceID -match '(?<=VID_)(....)'
if ( ! $bool ) {
return $null
}
$vid = $Matches [ 0 ]
$deviceID -match '(?<=PID_)(....)' | Out-Null
$p = $Matches [ 0 ]
}
$SHSEquip = MatchSHSEquipment $vid $p
if ( $SHSEquip ) {
return ( $SHSEquip [ 0 ] , $SHSEquip [ 1 ] )
}
$lookupTablePath = Join-Path ( get-item $PSScriptRoot ) . Parent . FullName 'Data\USBIDs.txt'
$usbIDs = Get-Content $lookupTablePath
for ( $i = 0 ; $i -lt $usbIDs . Count ; $i + + ) {
if ( $usbIDs [ $i ] -match $vid ) {
if ( $usbIDs [ $i ] [ 0 ] -eq " `t " ) {
}
else {
$man = ( $usbIDs [ $i ] -split ' ' )
$man = $man [ 2 . . $man . count ] -join ' '
for ( $y = $i + 1 ; $y -lt $usbIDs . Count ; $y + + ) {
if ( $usbIDs [ $y ] [ 0 ] -ne " `t " ) {
return ( $man , $null )
}
if ( $usbIDs [ $y ] -match $p ) {
$dev = ( $usbIDs [ $y ] -split ' ' )
$dev = $dev [ 2 . . $dev . count ] -join ' '
return ( $man , $dev )
}
}
return ( $man , $null )
}
}
}
}
function MatchSHSEquipment {
param (
$vid ,
$p
)
$lookupTablePath = Join-Path ( get-item $PSScriptRoot ) . Parent . FullName 'Data\SHSEquipmentLookup.txt'
$usbIDs = Get-Content $lookupTablePath
for ( $i = 0 ; $i -lt $usbIDs . Count ; $i + + ) {
if ( $usbIDs [ $i ] -match $vid ) {
if ( $usbIDs [ $i ] [ 0 ] -eq " `t " ) {
}
else {
$man = ( $usbIDs [ $i ] -split ' ' )
$man = $man [ 2 . . $man . count ] -join ' '
for ( $y = $i ; $y -lt $usbIDs . Count ; $y + + ) {
if ( $usbIDs [ $y ] -match $p ) {
$dev = ( $usbIDs [ $y ] -split ' ' )
$dev = $dev [ 2 . . $dev . count ] -join ' '
return ( $man , $dev )
}
}
return $null
}
}
}
return $null
}