Keine seriellen Ports mit WMI

  • C#

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von OlafSt.

    Keine seriellen Ports mit WMI

    Hallo Freunde,

    folgender Code soll mir per WMI alle verfügbaren seriellen Schnittstellen auslesen und ein paar grobe Werte ausspucken:

    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Management;
    4. using System.Text;
    5. namespace GetWMI_Info
    6. {
    7. class Program
    8. {
    9. // Die Klasse "Win32_SerialPort" stellt einen seriellen Anschluss in einem Win32-
    10. // System dar.
    11. static void Main(string[] args)
    12. {
    13. try
    14. {
    15. string ComputerName = "localhost";
    16. ManagementScope Scope;
    17. if (!ComputerName.Equals("localhost", StringComparison.OrdinalIgnoreCase))
    18. {
    19. ConnectionOptions Conn = new ConnectionOptions();
    20. Conn.Username = "";
    21. Conn.Password = "";
    22. Conn.Authority = "ntlmdomain:DOMAIN";
    23. Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), Conn);
    24. }
    25. else
    26. Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), null);
    27. Scope.Connect();
    28. ObjectQuery Query = new ObjectQuery("SELECT * FROM Win32_SerialPort");
    29. ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query);
    30. foreach (ManagementObject WmiObject in Searcher.Get())
    31. {
    32. Console.WriteLine("{0,-35} {1,-40}","Caption",WmiObject["Caption"]);// String
    33. Console.WriteLine("{0,-35} {1,-40}","Description",WmiObject["Description"]);// String
    34. Console.WriteLine("{0,-35} {1,-40}","DeviceID",WmiObject["DeviceID"]);// String
    35. }
    36. }
    37. catch (Exception e)
    38. {
    39. Console.WriteLine(String.Format("Exception {0} Trace {1}",e.Message,e.StackTrace));
    40. }
    41. Console.WriteLine("Press Enter to exit");
    42. Console.Read();
    43. }
    44. }
    45. }



    Das Phänomen: Unter Windows 7 64Bit läuft das tadellos. Das Progrämmchen spuckt aus:
    Caption -> Kommunikationsanschluss (COM1)
    Description -> Kommunikationsanschluss
    DeviceID -> COM1
    Press Enter to exit


    Kopiere ich das Programm auf meine Windows 8.1-Maschine, dann lautet die Ausgabe:

    Press Enter to exit


    Es wird also kein serieller Port gefunden, obwohl definitiv einer auf dem Mainboard vorhanedn ist und auch im Gerätemanager korrekt als COM1 angezeigt wird. Ich habe das ganze auch gegen .NET4.5, .NET4 und .NET2 compiliert, same results. Eine Portierung nach Delphi ergab das gleiche Ergebnis.
    Da ich dieses Problem am Ende mit Delphi lösen muß, sind mir die tollen System.IO-Namespaces verschlossen - es muß also irgendwie übers WMI gehen.

    Wo ist der Haken ?
    Ich habs selbst rausgefunden. Offenbar ist der bisher dafür vorgesehene Pfad "Win32SerialPort" im root\CIMV2 Microsoft nich mehr genehm - zumal er eh nur physisch vorhandene Ports ausgab; COM-Ports per USB-Wandler oder gar Einsteckkarte tauchen da gar nie nich auf.

    Man kommt nun nur mehr über "MSSerial_PortName" im root\WMI an diese Informationen ran. Dafür kriegt man dann aber auch alle seriellen Schnittstellen, also auch die via USB2Serial-Wandler und Einsteckkarten generierten virtuellen COM-Ports.

    Problem: Das ganze Auslesen erfordert nun Administrator-Rechte.