我猜,但由於您的查詢語法正確,並使用正確的領域和對象名稱,我想那是因爲你把這個字符串「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問題已經(表揚了\\\\
,而不是\\
)的需要。
你能告訴查詢中的'DSADatabaseFile'值是什麼嗎? – PresleyDias
我沒事,我在管理員帳戶下運行這個應用程序。 DSADatabaseFile的值爲C:\ Windows \ NTDS \ ntds.dit,其大小爲16MB。 我收到異常,因爲它會在foreach循環中的關鍵字中出現。 – sunder
試試這個'C:\\的Windows \\ \\ NTDS或ntds.dit'從鏈接http://stackoverflow.com/a/972232/1051198從Microsoft下載中心下載 – PresleyDias