3 Stimmen

Ich erhalte einen ungültigen Abfragefehler, wenn ich WHERE Name =

public static void Command(string vCommand, string machineName, string username, string password)
            {
                ManagementScope Scope = null;
                ConnectionOptions ConnOptions = null;
                ObjectQuery ObjQuery = null;
                ManagementObjectSearcher ObjSearcher = null;
                try
                {
                    ConnOptions = new ConnectionOptions();
                    ConnOptions.Impersonation = ImpersonationLevel.Impersonate;
                    ConnOptions.EnablePrivileges = true;
                    //local machine
                    if (machineName.ToUpper() == Environment.MachineName.ToUpper())
                        Scope = new ManagementScope(@"\ROOT\CIMV2", ConnOptions);
                    else
                    {
                        //remote machine
                        ConnOptions.Username = username;
                        ConnOptions.Password = password;
                        Scope = new ManagementScope(@"\\" + machineName + @"\ROOT\CIMV2", ConnOptions);
                    }
                    Scope.Connect();

                    ObjQuery = new ObjectQuery("SELECT * FROM Win32_Directory WHERE Name = 'c:\\0stuff'");
                    ObjSearcher = new ManagementObjectSearcher(Scope, ObjQuery);

                    foreach (ManagementObject obj in ObjSearcher.Get()) //ERROR HAPPEN HERE
                    {
                       //code here
                    }

                    if (ObjSearcher != null)
                    {
                        ObjSearcher.Dispose();
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }

Wenn ich nur "ObjQuery = new ObjectQuery("SELECT * FROM Win32_Directory");" verwende, habe ich überhaupt kein Problem.

Aber sobald ich versuche, "WHERE Name = X" zu verwenden, erhalte ich die Fehlermeldung "Ungültige Abfrage".

Ich weiß nicht, was los ist. (und bevor jemand fragt, ja c: \0stuff existieren).

3voto

Mark Byers Punkte 761508

Sie müssen ein wortwörtliches Stringliteral verwenden @"..." um zu verhindern, dass der Backslash in C# als Escape-Sequenz behandelt wird:

@"SELECT * FROM Win32_Directory WHERE Name = 'c:\\0stuff'"

Ohne die @ sieht die tatsächlich gesendete Abfrage wie folgt aus:

SELECT \* FROM Win32\_Directory WHERE Name = 'c:\\0stuff'

Beachten Sie, dass der Backslash nicht mehr korrekt escaped wird.

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