Hallo Freunde,
folgender Code soll mir per WMI alle verfügbaren seriellen Schnittstellen auslesen und ein paar grobe Werte ausspucken:
Spoiler anzeigen
Das Phänomen: Unter Windows 7 64Bit läuft das tadellos. Das Progrämmchen spuckt aus:
Kopiere ich das Programm auf meine Windows 8.1-Maschine, dann lautet die Ausgabe:
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 ?
folgender Code soll mir per WMI alle verfügbaren seriellen Schnittstellen auslesen und ein paar grobe Werte ausspucken:
C#-Quellcode
- using System;
- using System.Collections.Generic;
- using System.Management;
- using System.Text;
- namespace GetWMI_Info
- {
- class Program
- {
- // Die Klasse "Win32_SerialPort" stellt einen seriellen Anschluss in einem Win32-
- // System dar.
- static void Main(string[] args)
- {
- try
- {
- string ComputerName = "localhost";
- ManagementScope Scope;
- if (!ComputerName.Equals("localhost", StringComparison.OrdinalIgnoreCase))
- {
- ConnectionOptions Conn = new ConnectionOptions();
- Conn.Username = "";
- Conn.Password = "";
- Conn.Authority = "ntlmdomain:DOMAIN";
- Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), Conn);
- }
- else
- Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), null);
- Scope.Connect();
- ObjectQuery Query = new ObjectQuery("SELECT * FROM Win32_SerialPort");
- ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query);
- foreach (ManagementObject WmiObject in Searcher.Get())
- {
- Console.WriteLine("{0,-35} {1,-40}","Caption",WmiObject["Caption"]);// String
- Console.WriteLine("{0,-35} {1,-40}","Description",WmiObject["Description"]);// String
- Console.WriteLine("{0,-35} {1,-40}","DeviceID",WmiObject["DeviceID"]);// String
- }
- }
- catch (Exception e)
- {
- Console.WriteLine(String.Format("Exception {0} Trace {1}",e.Message,e.StackTrace));
- }
- Console.WriteLine("Press Enter to exit");
- Console.Read();
- }
- }
- }
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 ?