2012-05-02 22 views
2

このdsaファイルのサイズをc:\ windows \ ntds \ディレクトリに表示しようとしています。wmi無効なクエリエラー

ここではエラーが発生していますが、理由はわかりません。エラーは「無効な照会」です。

異なるWMIクラスを使用すると、このエラーが頻繁に発生するようです。

なぜこのエラーが発生し、これを解決するのか分かりません。

以下のコードにはエラーがありますか?これを解決する方法はありますか?

この無効なクエリエラーが発生する理由は何ですか?内部例外は常にnullになりますか?

private int getDatabaseFileSize(string DSADatabaseFile, string machineName) 
     { 
      string scope = @"\\" + machineName + @"\root\CIMV2"; 
      string query = string.Format("Select FileSize from CIM_DataFile WHERE Name = '{0}'", DSADatabaseFile); 
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); 
      ManagementObjectCollection collection = searcher.Get(); 
      foreach (ManagementObject mobj in searcher.Get()) 
      { 
       Console.WriteLine("File Size : " + mobj["FileSize"]); 
      } 
      return 0; 
     } 

おかげ

+0

クエリで 'DSADatabaseFile'があった場合、その値は何だったのかわかりますか? – PresleyDias

+0

私は大丈夫です、私は管理者のアカウントでこのアプリケーションを実行しています。 DSADatabaseFileの値はC:\ Windows \ NTDS \ ntds.ditで、サイズは16MBです。 foreachループでキーワードに達すると例外が発生します。 – sunder

+0

この 'C:\\ Windows \\ NTDS \\ ntds.dit'またはリンクhttp://stackoverflow.com/a/972232/1051198 – PresleyDias

答えて

3

私は推測しているが、あなたのクエリは文法的に正しく、正しいフィールドとオブジェクト名を使用するので、私はあなたが文字列「Cを通過するので、それがあると仮定:\ WINDOWS \ NTDS \ ntds.dit "をDSADatabaseFileとしてください。これは、Pathクラスなどを使用している場合のように、C#内の「標準的な」使用に適しています。

ファイル名を2つのバックスラッシュでWMIに渡す必要があります。しかし、C#はすでに、あなたが効果的に4を渡す必要がする必要があり、以来:

getDatabaseFileSize("C:\\\\Windows\\\\NTDS\\\\ntds.dit", machine) 

またはリテラル逐語的文字列の使用:

getDatabaseFileSize(@"C:\\Windows\\NTDS\\ntds.dit", machine); 

を更新ここでは完全な例である:

// Compile with: csc foo.cs /r:System.Management.dll 

using System; 
using System.Management; 

namespace Foo 
{ 
    public class Program 
    { 
     private int getDatabaseFileSize(string DSADatabaseFile, string machineName) 
     { 
      string scope = @"\\" + machineName + @"\root\CIMV2"; 
      string query = string.Format("Select FileSize from CIM_DataFile WHERE Name = '{0}'", DSADatabaseFile); 
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); 
      ManagementObjectCollection collection = searcher.Get(); 
      foreach (ManagementObject mobj in searcher.Get()) 
      { 
       Console.WriteLine("File Size : " + mobj["FileSize"]); 
      } 
      return 0; 
     } 

     public static void Main(string[] args) 
     { 
      var p = new Program(); 

      // These work 
      p.getDatabaseFileSize("C:/boot.ini", "."); 
      p.getDatabaseFileSize(@"C:\\boot.ini", "."); 
      p.getDatabaseFileSize("C:\\\\boot.ini", "."); 

      // These fail 
      try { 
       p.getDatabaseFileSize("C:\\boot.ini", "."); 
      } catch (ManagementException ex) { 
       Console.WriteLine("Failed: {0}", ex.ErrorCode); 
      } 
      try { 
       p.getDatabaseFileSize(@"C:\boot.ini", "."); 
      } catch (ManagementException ex) { 
       Console.WriteLine("Failed: {0}", ex.ErrorCode); 
      } 
     } 
    } 
} 

コンパイル:

ected)出力は次のようになります。

File Size : 313 
File Size : 313 
Failed: InvalidQuery. 
Failed: InvalidQuery. 

更新すでに(\\\\の代わり\\)の必要性に言及related問題があるようです。

+0

いいえ、私はすべてを試みました。 C:\\ Windowsの\\ \\ NTDSのNtds.ditとC:\\\\また、Windows \\\\ NTDS \\\\のNtds.dit。同じエラー。 – sunder

+0

まあ、あなたのコードを使用するときはうまくいきました(エラーと二重バックスラッシュを使った修正の両方)。ディレクトリセパレータとして(任意の)バックスラッシュの代わりに単一の(スラッシュ)スラッシュを使用することもできます。例えば。 'C:/ Windows/ntds/ntds.dit'も私にとってはうまくいきます。 –

+0

私はそれがあなたのために働くことに驚いていますが、私はすべての種類のスラッシュを試しました。 このエラーは、さまざまなwmiクラスで頻繁に発生します。 – sunder