Как я могу избежать правой фигурной скобки (}) в имени каталога запроса Win32_Directory WMI? - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь выполнить запрос WMI, в котором перечислены все подкаталоги в каталоге на другом компьютере (сервере), подключенном к сети, но он завершается с ошибкой System.Management.ManagementException «Недопустимый запрос».

Я практически уверен, что эта проблема связана с именем каталога, содержащим левые и / или правые фигурные скобки ({, }).

ОБНОВЛЕНИЕ: I 'мы определили, что проблема заключается не в левой фигурной скобке, а в правой фигурной скобке.

Я пробовал разные способы экранирования этих символов, но, похоже, ничего не работает.

Нижеэто надуманный пример, который каждый раз завершается с ошибкой «Неверный запрос».

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 Ответ

1 голос
/ 12 марта 2019

Это похоже на причуду синтаксического анализа Associators of. Чтобы исправить это, используйте синтаксис с двойными кавычками для строк, а не синтаксис с одинарными кавычками (чтобы избежать обратной косой черты, поскольку это требуется для подхода с двойными кавычками):

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