wmi无效的查询错误

时间:2012-05-02 05:33:16

标签: c# .net wmi wql

我正在尝试在c:\ windows \ ntds \目录中显示此dsa文件的大小。

我在这里收到错误,我不知道为什么。错误是“无效查询”。

当我使用不同的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;
        }

由于

1 个答案:

答案 0 :(得分:3)

我猜,但是因为你的查询在语法上是正确的并且使用正确的字段和对象名称,我认为这是因为你将字符串“C:\ Windows \ NTDS \ ntds.dit”作为{{1}传递}。这将通过纠正C#中的“典型”使用,例如在使用DSADatabaseFile类时使用,或者不在此处。

您需要将带有两个反斜杠的文件名传递给WMI。但是,由于C#已经要求,你需要有效地传递四个:

Path

或使用逐字字符串文字:

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

更新似乎已经出现了related个问题(提到需要File Size : 313 File Size : 313 Failed: InvalidQuery. Failed: InvalidQuery. 而不是\\\\)。