Laden...

System.Management.ManagementException - "nicht gefunden"

Erstellt von GeneVorph vor 3 Jahren Letzter Beitrag vor 3 Jahren 883 Views
G
GeneVorph Themenstarter:in
180 Beiträge seit 2015
vor 3 Jahren
System.Management.ManagementException - "nicht gefunden"

Hallöchen,

vorweg: ich bin mir nicht sicher, ob mein Post hier im richtigen Teil des Forums gelandet ist! Falls nicht: sorry und bitte ggf. verschieben! Danke.

Ich möchte in einer WindowsForms-App alle USB-Geräte in einer Collection auflisten. Dabei habe ich mich an diesem Beispiel orientiert. Meinen Code habe ich abgeändert, so dass er wie folgt ausschaut:


private void frmMainDisplay_Load(object sender, EventArgs e)
        {
            List<string> devices = new List<string>();
            ManagementObjectCollection devicesCollection;

            using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBControllerDevice"))
                devicesCollection = searcher.Get();

            foreach (var device in devicesCollection)
            {
                devices.Add((string)device.GetPropertyValue("ProductName"));
            }

            devicesCollection.Dispose();
        }

Da ich an den Devices und nicht an den Hubs interessiert bin, suche ich in Win32_USBControllerDevices.

Wenn ich meinen Code ausführe, stürzt er in der foreach-Schleife ab. Ich erhalte folgende Fehlermeldung:

Fehlermeldung:
System.Management.ManagementException: "nicht gefunden"
Diese Ausnahme wurde ursprünglich von dieser Aufrufliste ausgelöst:
[Externer Code]
VGACaptureDevice.frmMainDisplay.frmMainDisplay_Load(object, System.EventArgs) in Form1.cs
[Externer Code]

Beim Debugging habe ich festgestellt, dass im Ausgagbefenster folgendes angezeigt wird:

Ausnahme ausgelöst: "System.Management.ManagementException" in System.Management.dll
Ein Ausnahmefehler des Typs "System.Management.ManagementException" ist in System.Management.dll aufgetreten.
Nicht gefunden

Durch setzen eines Break-Points habe ich außerdem festgestellt, dass devicesCollection vor Ausführen der foreach-Schleife bei den Properties unter Count = 35 aufweist (ich nehme an, das sind sämtliche USB-devices plus hubs plus BlueTooth plus ?), ich diese 35 Items aber nicht näher Anschauen kann: unter Ergebnisansicht steht: "Fehler = Die Funktionsauswertung wurde deaktiviert, weil bei einer vorhergehenden Funktionsauswertung das Timeout überschritten wurde. Sie müssen die Ausführung fortsetzen, um die Funktionsauswertung wieder zu aktivieren." Tue ich das, stürzt die App allerdings wie zuvor beschrieben ab.

Um wirklich sämtliche Fehlerquellen auszuschließen, hier mal mein Vorgehen bis zu diesem Punkt: ich musste nämlich feststellen, dass es nicht genügt den Namespace System.Management per using hinzuzufügen; man muss auch händisch einen Verweis setzen. Dies habe ich getan mit

  • Rechtsklick auf mein Projekt --> Hinzufügen --> Verweis --> Häkchen gesetzt bei System.Management und System.Management.Instrumentation
  • OK geklickt.

Eine Google-Suche nach dem Fehler brachte zu Tage, dass möglicherweise das WMI-Repository von Windows beschädigt sein könnte. Ich habe dazu in der Powershell winmgmt /verifyrepository ausgeführt. "Leider" war das Ergebnis "Das Repository ist konsistent".

Damit gehen mir leider derzeit die Ideen aus - mein Code besteht lediglich aus den paar Zeilen weiter oben und die Fehlermeldung lässt mich leider auch im Regen stehen. Hat jemand eine Idee, was da falsch laufen könnte?

Vielen Dank.
Gruß
vorph

4.938 Beiträge seit 2008
vor 3 Jahren

Wie kommst du auf "ProductName"?
Probiere einfach mal nur "Name", s.a. Win32_USBController class (welche von der Win32_USBControllerDevice class aus referenziert wird - es kann aber sein, daß dies über WMI nicht direkt funktioniert, dann müßtest du "Select * From Win32_USBController" verwenden).

Du kannst auch ein WMI-Tool wie z.B. SimpleWMIView benutzen, um die korrekten Eigenschaftsnamen zu ermitteln.

G
GeneVorph Themenstarter:in
180 Beiträge seit 2015
vor 3 Jahren

Wie kommst du auf "ProductName"?

Zuerst hatte ich DeviceID, dann ProductName, nachdem ich es bei stackoverflow in einem anderen thread gefunden hatte. Beides funktionierte nicht.

Ich habe jetzt folgendes verändert:
aus


var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBControllerDevice"))

wurde jetzt


var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBController"))

Bei "ProductName" stürzt die App weiterhin ab.

Wenn ich nun "Name" eingebe, läuft die Schleife ohne Abbruch durch. Leider ist das Problem damit nicht gelöst (s. Screenshot):
Diesmal finden sich in der devicesCollection nur noch 4 Einträge (ehemals 35, wenn man "ProductName" eingibt): wenn ich nach der Schleife einen BreakPoint setze, dann sieht man unter Ergebnisansicht der devicesCollection dieselbe Fehlermeldung wie zuvor: "Fehler = Die Funktionsauswertung wurde deaktiviert, weil bei einer vorhergehenden Funktionsauswertung das Timeout überschritten wurde."

Also nach meinem Verständnis bedeutet das:

  • bei Win32_USBControllerDevice findet das Programm vor der Schleife 35 Einträge; ich kann jedoch nicht feststellen, was genau, denn beim ersten Schleifendurchlauf stürzt die App ab.
  • bei Win32_USBController wird die Schleife durchlaufen - 4 Einträge werden gefunden, aber ich kann dennoch nicht feststellen von was, denn ich finde keine Möglichkeit auf die einzelnen Items zuzugreifen.

Kurz zu WMI-Tool: ich hatte gestern abend noch WbemTest unter Windows 10 gestartet - ich meine mich zu erinnern, dass z. B. "DeviceID" im USBControllerDevice-Namespace zu finden war: trotzdem der Absturz. Das eigentiche Problem dürfte m. E. vor der Schleife zu finden sein. Ich werde dennoch mit SimpleWMIView nochmal mein Glück versuchen.

Vielen Dank soweit.

EDIT: im screenshot ist der breakpoint noch vor einstieg in die schleife - unter ergebnisansicht steht "Zeitüberschreitung Funktionsevaluierug". Setzt man den BP nach der Schleife, kommt die Meldung von oben.

190 Beiträge seit 2012
vor 3 Jahren

Hallo,

ich nehme immer dieses Tool: WMI Code Creator v1.0
Dies erzeugt dann auch gleich den Code in C#.
Und dein Programm benötigt nur den Verweis auf die System.Management.dll. Ich hab bei mir auf dem PC grade mal geschaut, da gibt es weder bei Win32_USBControllerDevice noch bei Win32_USBController das Property "ProductName".

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

190 Beiträge seit 2012
vor 3 Jahren

Wenn du USB Ports suchst, dann damit:


using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE ClassGuid='{4d36e978-e325-11ce-bfc1-08002be10318}'"))

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

G
GeneVorph Themenstarter:in
180 Beiträge seit 2015
vor 3 Jahren

Hallo Wilfried, danke für deinen Beitrag.

Ich habe mir noch einmal die Dokumentation zu Gemüte geführt (hier und hier) - was aber nur mehr zur Verwirrung beiträgt. Ich kann mir zwar übersetzen was da steht, aber was inhaltlich der Unterschied zwischen "relates a universal serial bus (USB) controller and the CIM_LogicalDevice instance connected to it" und "manages the capabilities of a universal serial bus (USB) controller" ist, bleibt mir damit ein Rätsel (für die Zustände eines Controllers ist eine andere Klasse zuständig als für die Kommunikation zwischen controller und device? Worin liegt dann der Unterschied zwischen Controller und Device?).

Ich hab bei mir auf dem PC grade mal geschaut, da gibt es weder bei Win32_USBControllerDevice noch bei Win32_USBController das Property "ProductName".

Stimmt, das habe ich nach dem Post von Th69 ebenfalls herausgefunden. Wie gesagt, das hatte ich in einem Post gefunden und (ganz unschuldig) statt DeviceId eingesetzt.

Tatsächlich funktioniert für meinen ursprünglichen Code "Antecedent", wenn ich die Win32_USBControllerDevice-Klasse ansteuere.

Aber ich bin ein Schrittchen weiter:
Mit ManagementObjectSearcher(@"Select * From Win32_USBControllerDevice")) und cmbDevices.Items.Add((string)device.GetPropertyValue("Antecedent")) bekomme ich 37 Einträge in meiner ComboBox angezeigt (gebs jetzt direkt in der ComboBox aus).
Beispiel (erster Eintrag):
\ARBEITS-PC\root\cimv2:Win32_USBController.DeviceID="PCI\VEN_1033&DEV_0194&SUBSYS_84131043&REV_04\4&DDEC341&0&00E1"

Mit ManagementObjectSearcher(@"Select * From Win32_USBController")) und cmbDevices.Items.Add((string)device.GetPropertyValue("DeviceId")) bekomme ich 4 in meiner ComboBox angezeigt.
Beispiel (erster Eintrag):
PCI\VEN_1033&DEV_0194&SUBSYS_84131043&REV_04\4&DDEC341&0&00E1

Tatsächlich weiß ich jetzt überhaupt nicht, was ich da angezeigt bekomme^^

Erwartet hätte ich z. B. im zweiten Fall die Id's der aktuell angeschlossenen Devices (Keyboard, Mouse) erwartet - ich bekomme aber 4 Einträge. Wenn ich außerdem zusätzlich einen USB-Stick anschließe sind es immer noch 4 Einträge, und zwar genau dieselben wie zuvor.

Die 37 Einträge aus dem ersten Fall erschließen sich mir hingegen überhaupt nicht: sind das nun Geräte, Ports, Geräte und Ports und wenn ja, wie komme ich dann um Himmelswillen auf 37??

BTW: Danke für den Topp zum WMI-CodeCreator - sobald ich kann, werde ich mir den mal genauer ansehen.