【发布时间】:2019-03-11 05:10:13
【问题描述】:
我正在尝试执行 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 服务器(是的,它已计划拆除)。
谢谢!
【问题讨论】:
-
可以this帮忙吗?
-
@vasily.sib - 您指出的问题建议使用插入符号 (
^) 字符进行转义。我试过用反斜杠、正斜杠、另一个大括号、插入符号 (^) 转义大括号 - 没有用。 -
看起来你有额外的右括号( } ),尝试注释掉查询中的第三行:
+ @"'} " -
@styx - 用于从 C# 字符串插值中转义花括号。
-
如果你“展开”你的查询,你会得到
Associators of {Win32_Directory.Name='c:\program files (x86)\a_test}'} Where AssocClass = Win32_Subdirectory ResultRole = PartComponent,你可以看到你有1个左括号和2个右括号