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
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Sorry ..
.NET 4.6.1 auf Windows 10
MfG Christian
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
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
@Th69:
ja mit WBETest u. WMI Explorer bekomme ich Daten ...
MfG Christian
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?])
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
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;
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