2

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

ありがとう

4

1 に答える 1

3

私は推測していますが、クエリは構文的に正しく、正しいフィールド名とオブジェクト名を使用しているため、文字列 "C:\Windows\NTDS\ntds.dit" を として渡すためだと思いますDSADatabaseFilePathこれは、クラスを使用する場合など、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);
            }
        }
    }
}

コンパイル:

(予想される)出力は次のとおりです。

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

更新関連する質問が既にあるようです( の\\\\代わりに が必要であることに言及しています\\)。

于 2012-05-02T05:51:31.037 に答える