├── .gitattributes ├── Form.ps1 ├── Form.xaml ├── README.md ├── assembly ├── MahApps.Metro.dll └── System.Windows.Interactivity.dll └── resources └── Icons.xaml /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto -------------------------------------------------------------------------------- /Form.ps1: -------------------------------------------------------------------------------- 1 | ######################################################################### 2 | # Author: Kevin RAHETILAHY # 3 | # Blog: dev4sys.com # 4 | ######################################################################### 5 | 6 | 7 | ######################################################################### 8 | # ASSEMBLY # 9 | ######################################################################### 10 | 11 | <<<<<<< HEAD 12 | [System.Reflection.Assembly]::LoadWithPartialName("System.windows.Forms") | Out-Null 13 | ======= 14 | >>>>>>> develop 15 | [System.Reflection.Assembly]::LoadWithPartialName('presentationframework') | out-null 16 | [System.Reflection.Assembly]::LoadWithPartialName("System.Web") | Out-Null 17 | [System.Reflection.Assembly]::LoadFrom('assembly\MahApps.Metro.dll') | out-null 18 | [System.Reflection.Assembly]::LoadFrom('assembly\System.Windows.Interactivity.dll') | out-null 19 | 20 | 21 | ######################################################################### 22 | # Load Main Panel # 23 | ######################################################################### 24 | 25 | $Global:pathPanel= split-path -parent $MyInvocation.MyCommand.Definition 26 | 27 | function LoadXaml ($filename){ 28 | $XamlLoader=(New-Object System.Xml.XmlDocument) 29 | $XamlLoader.Load($filename) 30 | return $XamlLoader 31 | } 32 | 33 | 34 | $XamlMainWindow=LoadXaml($pathPanel+"\form.xaml") 35 | $reader = (New-Object System.Xml.XmlNodeReader $XamlMainWindow) 36 | $Form = [Windows.Markup.XamlReader]::Load($reader) 37 | 38 | 39 | $MissinglistView = $Form.FindName("MissinglistView") 40 | $DisabledlistView = $Form.FindName("DisabledlistView") 41 | $OthersListView = $Form.FindName("OthersListView") 42 | 43 | $msinfo32 = $Form.FindName("msinfo32") 44 | $dxDiag = $Form.FindName("dxDiag") 45 | $devmgmt = $Form.FindName("devmgmt") 46 | 47 | $MissingBadge = $Form.FindName("MissingBadge") 48 | $DisabledBadge = $Form.FindName("DisabledBadge") 49 | $OthersdBadge = $Form.FindName("OthersdBadge") 50 | 51 | $FolderLocation = $Form.FindName("FolderLocation") 52 | $BrowseFolder = $Form.FindName("BrowseFolder") 53 | $ExportFile = $Form.FindName("ExportFile") 54 | 55 | $SearchArea = $Form.FindName("SearchArea") 56 | $SearchButton = $Form.FindName("SearchButton") 57 | 58 | $SearchArea.Visibility = "Collapsed" 59 | ######################################################################### 60 | # Initialize List # 61 | ######################################################################### 62 | 63 | try { 64 | 65 | if($MissinglistView.Items.Count -ne 0){ $MissinglistView.Items.Clear()} 66 | 67 | 68 | $DeviceList = Get-WmiObject Win32_PNPEntity | Where-Object {$_.ConfigManagerErrorCode -gt 0 } 69 | 70 | $MissingDriver = $DeviceList | Where-Object {$_.ConfigManagerErrorCode -eq 28 } 71 | $DisableDevice = $DeviceList | Where-Object {$_.ConfigManagerErrorCode -eq 22 -or $_.ConfigManagerErrorCode -eq 29 } 72 | $othersDevice = $DeviceList | Where-Object {$_.ConfigManagerErrorCode -ne 22 -and $_.ConfigManagerErrorCode -ne 29 -and $_.ConfigManagerErrorCode -ne 28 } 73 | 74 | 75 | $nbrOfMisingIssues = ($MissingDriver | Measure-Object).Count 76 | $nbrOfDisabledIssues = ($DisableDevice | Measure-Object).Count 77 | $nbrOfRestIssues = ($othersDevice | Measure-Object).Count 78 | 79 | $MissingBadge.Badge = $nbrOfMisingIssues 80 | $DisabledBadge.Badge = $nbrOfDisabledIssues 81 | $OthersdBadge.Badge = $nbrOfRestIssues 82 | 83 | # ======== Missing Driver ============ 84 | $Script:ContentObject = @() 85 | Foreach($device in $MissingDriver) { 86 | 87 | $objArray = New-Object PSObject 88 | $objArray | Add-Member -type NoteProperty -name Caption -value $device.Caption 89 | $objArray | Add-Member -type NoteProperty -name PNPDeviceID -value $device.PNPDeviceID 90 | $objArray | Add-Member -type NoteProperty -name ErrorCode -value $device.ConfigManagerErrorCode 91 | If ($device.Manufacturer -ne $null){$objArray | Add-Member -type NoteProperty -name Manufacturer -value $device.Manufacturer} 92 | Else{$objArray | Add-Member -type NoteProperty -name Manufacturer -value "Unknown"} 93 | $ContentObject += $objArray 94 | $MissinglistView.Items.Add($objArray) | Out-Null 95 | } 96 | 97 | # ======== Missing Driver ============ 98 | $Script:ContentObject1 = @() 99 | Foreach($device in $DisableDevice) { 100 | 101 | $objArray = New-Object PSObject 102 | $objArray | Add-Member -type NoteProperty -name Caption -value $device.Caption 103 | $objArray | Add-Member -type NoteProperty -name PNPDeviceID -value $device.PNPDeviceID 104 | $objArray | Add-Member -type NoteProperty -name ErrorCode -value $device.ConfigManagerErrorCode 105 | If ($device.Manufacturer -ne $null){$objArray | Add-Member -type NoteProperty -name Manufacturer -value $device.Manufacturer} 106 | Else{$objArray | Add-Member -type NoteProperty -name Manufacturer -value "Unknown"} 107 | $ContentObject1 += $objArray 108 | 109 | $DisabledlistView.Items.Add($objArray) | Out-Null 110 | } 111 | 112 | # ======== Missing Driver ============ 113 | $Script:ContentObject2 = @() 114 | Foreach($device in $othersDevice) { 115 | 116 | $objArray = New-Object PSObject 117 | $objArray | Add-Member -type NoteProperty -name Caption -value $device.Caption 118 | $objArray | Add-Member -type NoteProperty -name PNPDeviceID -value $device.PNPDeviceID 119 | $objArray | Add-Member -type NoteProperty -name ErrorCode -value $device.ConfigManagerErrorCode 120 | If ($device.Manufacturer -ne $null){$objArray | Add-Member -type NoteProperty -name Manufacturer -value $device.Manufacturer} 121 | Else{$objArray | Add-Member -type NoteProperty -name Manufacturer -value "Unknown"} 122 | $ContentObject2 += $objArray 123 | 124 | $OthersListView.Items.Add($objArray) | Out-Null 125 | } 126 | 127 | } 128 | catch { 129 | Write-Host $_.Exception.Message 130 | } 131 | 132 | 133 | 134 | $Form.add_MouseLeftButtonDown({ 135 | $_.handled=$true 136 | $this.DragMove() 137 | }) 138 | 139 | 140 | 141 | ######################################################################### 142 | # Event Manager # 143 | ######################################################################### 144 | 145 | #Region "Quick Links" 146 | 147 | $msinfo32.add_Click({ 148 | #System Information Summary 149 | msinfo32 150 | }) 151 | $dxDiag.add_Click({ 152 | # Load DXdiag 153 | dxdiag 154 | }) 155 | $devmgmt.add_Click({ 156 | # start device manager 157 | devmgmt.msc 158 | }) 159 | 160 | #End region 161 | 162 | #Region "Export" 163 | 164 | function BrowseInIE () { 165 | Param($PNDdevice) 166 | # encode the chain with ASCII value to pass as a web request search. 167 | $query = [System.Web.HttpUtility]::UrlEncode($PNDdevice) 168 | # create an instane of IE and launc search 169 | $ie = New-Object -ComObject InternetExplorer.Application 170 | $stringURL = "http://www.google.com/search?q="+$query 171 | Write-Host $stringURL 172 | $ie.Navigate($stringURL) 173 | $ie.Visible = $true 174 | 175 | } 176 | 177 | $MissinglistView.Add_SelectionChanged({ 178 | $SearchArea.Visibility = "Visible" 179 | # update the selected device 180 | $script:CurrentDevice = $MissinglistView.SelectedItem 181 | }) 182 | 183 | $SearchButton.add_Click({ 184 | 185 | if($script:CurrentDevice -ne "" -or $script:CurrentDevice -ne $null){ 186 | Write-Host $CurrentDevice.PNPDeviceID 187 | # borwse in IE 188 | BrowseInIE -PNDdevice $CurrentDevice.PNPDeviceID 189 | } 190 | }) 191 | 192 | $BrowseFolder.add_Click({ 193 | 194 | $foldername = New-Object System.Windows.Forms.FolderBrowserDialog 195 | $foldername.rootfolder = "Desktop" 196 | 197 | if($foldername.ShowDialog() -eq "OK") 198 | { 199 | $folder = $foldername.SelectedPath 200 | } 201 | 202 | $FolderLocation.Text = $folder 203 | }) 204 | 205 | $ExportFile.add_Click({ 206 | 207 | $FileNameExport = $FolderLocation.Text + "\MissingDriver.csv" 208 | $retVal = 0 209 | try{ 210 | $ContentObject | export-csv -Path $FileNameExport -Delimiter ";" -NoTypeInformation 211 | $ContentObject1 | export-csv -Path $FileNameExport -Delimiter ";" -Append -NoTypeInformation 212 | $ContentObject2 | export-csv -Path $FileNameExport -Delimiter ";" -Append -NoTypeInformation 213 | } 214 | Catch{ 215 | Write-Host $_.Exception.Message 216 | $retVal = 1 217 | } 218 | 219 | If ($retVal -eq 0){ [MahApps.Metro.Controls.Dialogs.DialogManager]::ShowModalMessageExternal($Form,"Export File", "File has been successfully created.") } 220 | else{[MahApps.Metro.Controls.Dialogs.DialogManager]::ShowModalMessageExternal($Form,"Export File", "An error occured when exporting the file. :( ")} 221 | 222 | }) 223 | 224 | #End region 225 | 226 | 227 | ######################################################################### 228 | # Show Dialog # 229 | ######################################################################### 230 | $Form.ShowDialog() | Out-Null 231 | -------------------------------------------------------------------------------- /Form.xaml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 36 | 37 | 38 | 39 | 40 | 41 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 |