# Developed by
# soccer_dan / vsweeting

$oFileName = (get-ciminstance win32_bios).SerialNumber + '_InfoQuery.txt'
$OutFile = $PSScriptRoot + '' + '\' + $oFileName
get-ciminstance win32_bios | Format-List Serialnumber, BIOSVersion|
write-output >> $OutFile
get-ciminstance Win32_ComputerSystem | format-list Model, PartofDomain, Domain, BootupState|
write-output >> $OutFile
get-ciminstance Win32_OperatingSystem | select-object Caption, BuildNumber, OSArchitecture, InstallDate, LastBootUpTime|
write-output >> $OutFile
$namespace = "ROOT\Intel\Thunderbolt"
$classname = "TbtControllerDetails"
$computer = $env:COMPUTERNAME
$tb = Get-WmiObject -Class $classname -ComputerName $computer -Namespace $namespace -ErrorAction:ignore
$TBSecLevel = ''
if ( $tb ) {
    switch ( $tb.SecurityLevel ) {
        0 { $TBSecLevel = 'No Security' }    
        1 { $TBSecLevel = 'User Authorization' }
        2 { $TBSecLevel = 'Secure Connect' }
        3 { $TBSecLevel = 'DisplayPort and USB' }
        default { $TBSecLevel = 'Unknown security setting' }
    }  # switch ()
    Write-Output "ThunderBolt Detected: Gen $($tb.Generation), NVMVersion $($tb.NVMVersion), PDVersion $($tb.PDVersion), 
    Security Level: $($tb.SecurityLevel) ($TBSecLevel)`n" >> $OutFile
} else {
    write-output "ThunderBolt Controller not detected" >> $OutFile
}
write-output "Driver List (Press Ctrl+F to Search):" >> $OutFile
Get-WmiObject Win32_PnPSignedDriver |Select devicename, driverversion |sort devicename |
where {
$_.DeviceName -like "*Intel(R)*" -or
$_.DeviceName -like "*AMD*" -or 
$_.DeviceName -like "*NVidia*" -or 
$_.DeviceName -like "*Dock*" -or 
$_.DeviceName -like "*Ethernet*" -or
$_.DeviceName -like "*Thunder*" -or 
$_.DeviceName -like "*WAN*" -or
$_.DeviceName -like "*LAN*" -or
$_.DeviceName -like "*WLAN*" -or
$_.DeviceName -like "*Audio*" -or
$_.DeviceName -like "*Camera*" -or
$_.DeviceName -like "*Bluetooth*" -or
$_.DeviceName -like "*Synaptic*" -or
$_.DeviceName -like "*Mouse*" -or
$_.DeviceName -like "*Keyboard*" -or
$_.DeviceName -like "*Track*" -or
$_.DeviceName -like "*Thermal*" -or
$_.DeviceName -like "*Chipset*" -or
$_.DeviceName -like "*Display*" -or
$_.DeviceName -like "*Graphic*" -or
$_.DeviceName -like "*Sensor*" -or
$_.DeviceName -like "*Firmware*" -or
$_.DeviceName -like "*Speaker*" -or
$_.DeviceName -like "*Power*" -or 
$_.DeviceName -like "*Card*" -or 
$_.DeviceName -like "*Reader*" -or 
$_.DeviceName -like "*Touch*" -or 
$_.DeviceName -like "*Pen*" -or 
$_.DeviceName -like "*Bio*" -or 
$_.DeviceName -like "*Finger*" -or 
$_.DeviceName -like "*Storage*" -or 
$_.DeviceName -like "*NVM*" -or 
$_.DeviceName -like "*SATA*" -or 
$_.DeviceName -like "*M.2*" -or 
$_.DeviceName -like "*Calib*" -or 
$_.DeviceName -like "*Micro*" -or 
$_.DeviceName -like "*Lenovo*" -or 
$_.DeviceName -like "*Trusted*" -or 
$_.DeviceName -like "*System Interface*" -or 
$_.DeviceName -like "*Fn and function*" -or 
$_.DeviceName -like "*Print*" } |
Format-Table >> $OutFile
set-location $PSScriptRoot