2012-05-02 155 views
2

我想獲取這個dsa文件存在於c:\ windows \ ntds \目錄中的大小。wmi無效的查詢錯誤

我在這裏得到錯誤,我不知道爲什麼。錯誤是「無效的查詢」。

我看來,當我用不同的WMI類的工作就是讓這種錯誤經常。

我不知道爲什麼這個錯誤發生,如何解決這個問題?

是否有下面的代碼錯誤,如何解決這個問題?

爲什麼我們會得到這個無效查詢錯誤,它是什麼來源?它的內部異常將始終爲空?

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從Microsoft下載中心下載 – PresleyDias

回答

3

我猜,但由於您的查詢語法正確,並使用正確的領域和對象名稱,我想那是因爲你把這個字符串「C:\ WINDOWS \ NTDS \ ntds.dit「爲DSADatabaseFile。這將正確的使用C#中的「典型」使用,例如使用Path類,或類似的,但不在這裏。

您需要將帶有兩個反斜槓的文件名傳遞給WMI。然而,由於C#要求已經,您需要有效地傳遞四個:

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); 
      } 
     } 
    } 
} 

編譯:

(exp 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