如何在WMI Win32_Directory查询的目录名称中转义右括号(})?

时间:2019-03-11 05:10:13

标签: c# wmi wmi-query wql

我正在尝试执行WMI查询,该查询列出了连接到网络的另一台计算机(服务器)上的目录中的所有子目录,但是它失败并出现System.Management.ManagementException“无效查询”异常。

我几乎可以肯定,此问题是由于目录名称包含左括号和/或右括号({})引起的。

更新:我已确定问题不是左弯括号,而是右弯括号。

我已经尝试了各种方法来逃避这些字符,但是似乎没有任何作用。

下面是一个人为设计的示例,每次都会以“无效查询”失败。

using System;
using System.Management;

public static class Program
{
    public static void Main()
    {
        const string username = @"Domain\User";
        const string password = @"Password";
        const string server = @"Server";

        const string query = @"Associators of {"
                             + @"Win32_Directory.Name='"
                             + @"c:\program files (x86)\a_test}"
                             + @"'} "
                             + @"Where AssocClass = Win32_Subdirectory ResultRole = PartComponent";

        var options = new ConnectionOptions { Username = username, Password = password };
        var wmiScope = new ManagementScope(@"\\" + server + @"\root\cimv2", options);
        var wmiQuery = new ObjectQuery(query);
        var searcher = new ManagementObjectSearcher(wmiScope, wmiQuery);
        var searchResults = searcher.Get();

        foreach (var searchResult in searchResults)
        {
            var subPath = searchResult.GetPropertyValue("Name").ToString();
            var system = Convert.ToBoolean(searchResult.GetPropertyValue("System"));
            Console.WriteLine($"subPath = {subPath}; system = {system}");
        }
    }
}

就其价值而言,该代码正在Windows 10计算机上运行,​​查询Windows 2008 R2 SP1服务器(是的,已计划拆除)。

谢谢!

1 个答案:

答案 0 :(得分:1)

这似乎是Associators of解析的怪癖。要解决此问题,请对字符串使用双引号语法,而不要使用单引号语法(请注意避免转义反斜杠,因为双引号方法需要这样做):

const string query = @"Associators of {"
                     + @"Win32_Directory.Name="""
                     + @"c:\\program files (x86)\\a_test}"
                     + @"""} "
                     + @"Where AssocClass = Win32_Subdirectory ResultRole = PartComponent";