5 Stimmen

WMI-Abfrage in C# funktioniert nicht auf NON-English Machine

Ich erstelle eine Anwendung, die verfolgen muss, wann ein Prozess beginnt, und dann ein Ereignis auslösen, wenn er beendet ist.

Ich habe einen Code, der auf einem englischen Rechner perfekt funktioniert und genau das tut, was ich brauche, aber wenn ich dieselbe Anwendung auf einem französischsprachigen Rechner ausführe, schlägt sie fehl.

Hier ist der Code, der fehlschlägt

qstart = new WqlEventQuery("__InstanceCreationEvent",
            new TimeSpan(0, 0, 0, 0, 5),
            "TargetInstance isa \"Win32_Process\"");

qstop = new WqlEventQuery("__InstanceDeletionEvent",
            new TimeSpan(0, 0, 0, 0, 5),
            "TargetInstance isa \"Win32_Process\"");
        try
        {
            using (wstart = new ManagementEventWatcher(qstart))
            {
                wstart.EventArrived += new EventArrivedEventHandler(ProcessStarted);
                Log.DebugEntry("BeginProcess() - Starting wstart Event");
                wstart.Start();
            }
        }
        catch (Exception ex)
        {
            Log.DebugEntry("error on wstart: " + ex.Message);
        }

        using (wstop = new ManagementEventWatcher(qstop))
        {
            wstop.EventArrived += new EventArrivedEventHandler(ProcessStopped);
            Log.DebugEntry("BeginProcess() - Starting wstop Event");
            wstop.Start();
        }

der Fehler tritt auf, wenn er versucht, die wstart.Start();

a wstop.Start();

Ich kann nur vermuten, dass es etwas mit der Sprache und dem Abfrage-String zu tun hat, aber ich klammere mich an Strohhalme.

Der Fehler, der angezeigt wird, lautet: "nicht analysierbare Nachfrage"

Für jede Hilfe sind wir Ihnen dankbar!

Martyn

Edit: Getestet auf 2 identischen Rechnern, einziger Unterschied ist die beim ersten Start gewählte Sprache.

7voto

Thomas Levesque Punkte 277723

Anscheinend liegt es daran, dass das von Ihnen angegebene Intervall zu klein ist... Ich habe es gerade auf einem französischen Windows XP SP3 ausprobiert und den gleichen Fehler erhalten. Aber wenn ich stattdessen das Intervall auf 1 Sekunde ändere, funktioniert es gut... Es scheint, dass man kein kleineres Intervall als 1 Sekunde angeben kann. Ich bin mir allerdings nicht sicher, warum dies nur auf einem nicht-englischen Betriebssystem passiert...

EDIT: Mir ist gerade klar geworden, dass es sich wahrscheinlich um einen Fehler in WqlEventQuery . Die qstart.QueryString sieht so aus mit CurrentCulture = "en-US" :

select * from __InstanceCreationEvent within 0.005 where TargetInstance isa "Win32_Process"

Aber mit CurrentCulture = "fr-FR" sieht es so aus:

select * from __InstanceCreationEvent within 0,005 where TargetInstance isa "Win32_Process"

(Beachten Sie den Unterschied im Zahlenformat)

Offenbar ist der Code in WqlEventQuery erzwingt nicht die Verwendung der unveränderlichen Kultur für die Formatierung der Zahl, wodurch die Abfrage in Kulturen, in denen das Dezimaltrennzeichen nicht "" ist, nicht korrekt ist.

Wenn Sie die CurrentCulture à CultureInfo.Invariant funktioniert die Abfrage einwandfrei, auch auf einem französischen Betriebssystem. Sie können die WQL-Abfrage auch manuell schreiben...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X