WMI 无效查询错误

本文关键字:错误 查询 无效 WMI | 更新日期: 2023-09-27 18:32:48

我正在尝试获取c:''windows'tds''目录中存在的此dsa文件的大小。

我在这里遇到错误,我不知道为什么。错误为"无效查询"。

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

谢谢

WMI 无效查询错误

猜,但由于您的查询在语法上是正确的并且使用正确的字段和对象名称,因此我认为这是因为您将字符串"C:''Windows''NTDS'tds.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);
            }
        }
    }
}

编译方式:

(预期的)输出为:

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

更新似乎已经有一个相关的问题(提到需要''''而不是'')。