.net - C # få tilsluttet enhedsinformation

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg leder efter en måde at få oplysninger om, hvilke eksterne enheder der aktuelt er forbundet til den maskine, der kører applikationen.


Periferiudstyr slags:



  • Displays (Opløsning, Producent, Model, Serienummer og/eller Unikt Enhedsidentifikator)

  • Printere (Producent, Model, Serienummer og/eller unikt enhedsidentifikator)

  • Mus (Fabrikant, Model, Serienummer og/eller unik enhedsidentifikator)

  • Tastatur (Fabrikant, Model, Serienummer og/eller unikt enhedsidentifikator)

  • etc



Jeg forsøgte flere WMI-klasser (win32\_desktopmonitor, win32\_pnpentity, win32\_printer osv.), Men indtil nu har jeg ikke fundet en api eller et bibliotek, der giver mig alle de søgte data. De har heller ikke de data, returnerer tom eller returneres med en generisk reference.


Det primære formål med denne applikation er indsamling af enhedsoplysninger.


Har nogen noget eksempel eller kan give mig en retning i hvilket bibliotek eller api jeg skal søge efter disse data.

Bedste reference


Til monitoroplysninger


select * from win32\_pnpentity where PNPClass = 'Monitor'


Der er 2 typer printere lokalt eller netværk. For lokale printere vil Win32\_Printer arbejde.


Men for netværksprintere skal du læse registreringsdatabasenøgle eller køre forespørgsel. Registreringsnøgle har meget raffineret information.


HKEY\_LOCAL\_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionPrintProvidersClient Side Rendering Print ProviderServers<Printer\_Name>Printers<Some ID>


select * from win32\_pnpentity where PNPClass = 'Printer'


For oplysninger om tastatur og mus, uanset hvad vi viser i Enhedshåndtering , vil de samme oplysninger være der i Win32\_PNPEntity


select * from win32\_pnpentity where PNPClass = 'Keyboard'

select * from win32\_pnpentity where PNPClass = 'Mouse'

Andre referencer 1


Der er to måder at gøre ved at gøre dette ...


Brug af Systemmanagement



Dette er en klasse tilgængelig i .NET allerede og kan tilføjes som en reference til dit projekt. Når du har tilføjet det som en reference, skal du huske at inkludere using System.Management; øverst på din kode.


ManagementObjectSearcher win32Monitor = new ManagementObjectSearcher("select * from Win32\_DesktopMonitor");

foreach (ManagementObject obj in win32Monitor.Get())
{
    Console.WriteLine(obj["ScreenWidth"].ToString());
    Console.WriteLine(obj["ScreenHeight"].ToString());
    Console.WriteLine(obj["Manufacturer"].ToString());
    Console.WriteLine(obj["DeviceID"].ToString());
}


Dette vil give alle de data, du har brug for. DeviceID er en 'unik identifikator' som defineret af MSDN dokumentation. Der er mange flere detaljer, du kan få adgang til om hver af de klasser jeg refererer her, som jeg forklarer senere.


Selvom du bruger System.Management, er det helt rimeligt og får alle de data, du har brug for, fandt jeg det lidt klodset i praksis, da det kræver, at du manuelt konverterer hver attribut og skriver en SQL-forespørgsel for at få dine data, så jeg skrev min egen bibliotek for at løse dette problem kaldet SimpleWMI.


Brug af SimpleWMI



For at installere dette bibliotek eller forstå, hvad det kan gøre i lidt mere dybde, besøg GitHub-siden, hvor du kan finde downloads osv. [14]


Jeg har også implementeret denne nøjagtige situation i eksempelprojektet på GitHub, så du ved hvad du skal gøre.


Dette udfører samme funktion som ovenfor, men koden er lettere at huske og kræver ikke konvertering af data:


foreach (dynamic obj in WMIQuery.GetAllObjects(Win32.PointingDevice))
{
    Console.WriteLine(obj.Name);
    Console.WriteLine(obj.Manufacturer);
    Console.WriteLine(obj.DeviceID);
}


For at søge en anden klasse, skal du bare erstatte PointingDevice med uanset hvilken Win32-klasse du ønsker (f.eks. DesktopMonitor, Keyboard eller Printer).


At få de rigtige data

For at få de attributter, som den specifikke klasse vil returnere (dvs. Navn, Producent og DeviceID som set ovenfor for at nævne nogle få), se dokumentationen for den pågældende klasse.


Dokumentation for eksterne enheder og anden computerhardware findes på MSDN Computersystem Hardware Classes-siden. [15]


Attributten, du søger efter at få et unikt enhedsidentifikator, er DeviceID, som skal være en attribut på stort set alle hardwareklasser eller eksterne enheder, du skal bruge.


Producenter er ikke tilgængelige i alle klasser, som f.eks. Win32\_Keyboard, men skal være tilgængelige for mange ved at henvise til ejendommen Manufacturer.


Modellen af ​​enheden dokumenteres ikke konsekvent af Windows i WMI-klasser, men hvis den er tilgængelig, vil den normalt være placeret under egenskaben Name.


Det skal dække alt, hvad du er forvirret om, men lad mig vide, om der er noget andet jeg kan hjælpe med!