Laden...

Wie kann ich Informationen vom Betriebssystem abfragen?

Erstellt von ChrisProg vor 4 Jahren Letzter Beitrag vor 4 Jahren 2.311 Views
ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 4 Jahren
Wie kann ich Informationen vom Betriebssystem abfragen?

Hallo zusammen,

Ich verzweifle an folgendem (exemplarisch):


try
{
      string version_Os = String.Empty;
     // Get the OS information.
     string os_query = "SELECT * FROM Win32_OperatingSystem";

     ManagementObjectSearcher os_searcher = new ManagementObjectSearcher(os_query);
     foreach (ManagementObject info in os_searcher.Get())
     {
         version_Os = info.Properties["Version"].Value.ToString();
     }
}
catch (System.Threading.ThreadAbortException ex) { }
catch (System.Management.ManagementException ex) { }
catch (Exception ex) { }

Ich erhalte jedesmal einen Fehler mit leerer Message(siehe Anhang...)

Wenn ich durch den Code stepe, sehe ich, das er für "ManagementObject info in os_searcher.Get()" recht lange (einige Sekunden) braucht...

Versuche ich dann auf "os_searcher.Get().Count" zuzugreifen, erhalte ich folgenden Fehler:> Fehlermeldung:

'os_searcher.Get().Count' löste eine Ausnahme des Typs 'System.Runtime.InteropServices.COMException' aus

Die Entwicklungsumgebung wird als Admin gestartet und auch der angemeldete User ist Admin ..
Das BS ist Win10 Pro

Bin für jede Hilfe dankbar ...

MfG Christian

16.806 Beiträge seit 2008
vor 4 Jahren

Was ist denn Dein Ziel?

Die OS Version bekommst Du Systemübergreifend über Environment.OSVersion
Auf .NET Core funktioniert der Namespace soweit ich weiß erst ab 3.0.

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 4 Jahren

Mein Ziel ist es Informationen vom System zu bekommen...

Ich habe "SELECT * FROM Win32_OperatingSystem" exemplarisch genommen, um andere Fehler auszuschließen ...

Ursprünglich will ich folgendes ermitteln:
"Select * From Win32_Process Where ProcessID = " + processId ( wobei die ProcessId schon vorher ermittelt wird...)

Es ist leider ganz gleich, welchen der vielen Befehle und Möglichkeiten ich nehme, ich scheitere immer am searcher.Get().Count der nie "0" ist, sondern immer einen Fehler schmeißt ...

MfG Christian

16.806 Beiträge seit 2008
vor 4 Jahren

Und Du bist auf was?
.NET Core 2? 3? .NET Framework? Windows...?

ManagementObject hat sehr große Einschränkungen.
zB können Windows Einstellungen und Group Policies die Verwendung von WMI beeinflussen.

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 4 Jahren

Sorry ..

.NET 4.6.1 auf Windows 10

MfG Christian

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 4 Jahren

Und Du bist auf was?
.NET Core 2? 3? .NET Framework? Windows...?

ManagementObject hat sehr große Einschränkungen.
zB können Windows Einstellungen und Group Policies die Verwendung von WMI beeinflussen.

kannst Du das eventuell näher ausführen ?

MfG Christian

16.806 Beiträge seit 2008
vor 4 Jahren

Bin kein OS Profi; weiß aber, dass WMI sehr fragil ist und am besten vermieden werden sollte, wenn möglich.
Ich weiß auch, dass WMI zickig ist, was Berechtigungen und das System betrifft - und, dass der empfohlene Weg nicht WMI ist 😃

Wenn Du also andere Möglichkeiten als WMI hast, um an Deine Infos zu kommen: nutze sie.

4.931 Beiträge seit 2008
vor 4 Jahren

Funktionieren denn andere WMI-Queries (s. z.B. Win32 Classes)?

Du könntest auch mal das bei Windows enthaltene WBEMTest (s. WBEMTest - Part 2: WMI queries) oder WMI Explorer ausprobieren, ob generell WMI Abfragen auf dem Rechner funktionieren.

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 4 Jahren

@Th69:

ja mit WBETest u. WMI Explorer bekomme ich Daten ...

MfG Christian

4.931 Beiträge seit 2008
vor 4 Jahren

Dann müßtest du wohl mal in den .NET-Code hineindebuggen (ist schon etwas länger her, daß ich das mal gemacht habe - evtl. hilft: How to: Debug .NET Framework source oder Configure Visual Studio 2013 for debugging .NET framework [hoffentlich noch aktuell?])

127 Beiträge seit 2015
vor 4 Jahren

Könnte auch am "Scope" deiner Abfrage liegen.
Bin mir nicht sicher was der Defaultscope des Management searcher objects ist.
Am besten mal in der Doku schauen.

Aber du mußt beim WBETest meines Wissens nach auch einen Scope angeben (so etwas in der Art wie: root\CIMV2)

Dementsprechend mußt du auch sicherstellen das dein Searcher auch diesen Scope benutzt.
Es gibt einen entsprechenden Konstruktor

4.931 Beiträge seit 2008
vor 4 Jahren

Das dachte ich auch erst, aber "root\CIMV2" sollte der Default-Namespace beim Konstruktor (ohne Angabe dessen) sein - aber einen Versuch ist das natürlich wert.
Mittels ManagementPath DefaultPath läßt sich dieser auch auslesen (bzw. setzen).
Und so läßt sich der Pfad nachträglich ermitteln:


string namespacePath = managementObjectSearcher.Scope.Path.NamespacePath;

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 4 Jahren

Leider habe ich wieder keine Benachrichtigungen bekommen, deshalb die verspätete Antwort 🤔

Danke für die Antworten, werde mir das mal zu Gemüte führen...

MfG Christian