2010-09-01 20 views
3
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; 
       } 
      } 
     } 

Si je n'utilise que "ObjQuery = new ObjectQuery (" SELECT * FROM Win32_Directory ");", je reçois pas de problème du tout. Mais dès que j'essaie d'utiliser "WHERE Name = X", j'obtiens une erreur "query invalid".je reçois une erreur de requête non valide quand j'ajoute WHERE nom =

Je ne sais pas ce qui ne va pas. (et avant que quelqu'un demande, oui c: \ 0stuff existe).

Répondre

3

Vous devez utiliser une chaîne littérale mot à mot @"..." pour empêcher la barre oblique inverse étant traité comme une séquence d'échappement en C#:

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

Sans @ la requête qui est effectivement envoyé ressemblera à ceci:

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

Notez que la barre oblique inverse n'est plus correctement échappée.

+0

Cela fonctionne! Merci beaucoup. Comment diable devais-je savoir que je devais doubler le backslash pour les deux C# ET SQL> _ < C'est quelque chose que je n'oublierai pas (j'espère) – Wildhorn