C#通过WMI按共享名查询本地物理路径时WQL报无效查询异常
异常触发原因
- 构造的WQL(WMI查询语言)字符串存在致命语法错误,直接导致WMI引擎无法解析:
- 语句内容重复拼接了两段Select查询,出现
where Path likeSelect * from Win32_Share的非法片段,完全不符合WQL语法规则 - C#字符串拼接逻辑残缺,拼接
shareName变量时遗漏了+连接符,最终生成的查询语句语义混乱、结构残缺
- 语句内容重复拼接了两段Select查询,出现
- 上述问题直接触发
System.Management.ManagementException: 'Invalid query'异常。
修正实现
- 针对“按共享名查本地路径”的需求,由于Win32_Share实例的Name字段在同一主机下唯一,无需使用模糊匹配的
like条件,改用精确匹配Name = '共享名'即可简化查询逻辑,避免误匹配其他前缀相似的共享 - 修正字符串拼接逻辑,生成合法可解析的WQL语句
- 移除原代码中冗余的阻塞逻辑(如查询循环内的
Console.ReadLine()、直接打印字典对象的无效代码)
修正后的可运行代码:
using System; using System.Collections.Generic; using System.Management; namespace SharePathTool { class Program { static void Main(string[] args) { Console.WriteLine("ENTER SERVER NAME "); string serverName = Console.ReadLine().Trim(); Console.WriteLine("ENTER SHARE FOLDER NAME"); string shareName = Console.ReadLine().Trim(); Dictionary<string, string> shares = GetNetworkShareDetailUsingWMI(serverName, shareName); foreach (KeyValuePair<string, string> share in shares) { Console.WriteLine($"{share.Key}: {share.Value}"); Console.WriteLine("-------------"); } Console.ReadLine(); } public static Dictionary<string, string> GetNetworkShareDetailUsingWMI(string serverName, string shareName) { Dictionary<string, string> shares = new Dictionary<string, string>(); // 目标主机WMI命名空间连接路径 ManagementScope scope = new ManagementScope($@"\\{serverName}\root\cimv2"); scope.Connect(); // 构造合法WQL查询,对传入的共享名做单引号转义避免语法错误 ObjectQuery query = new ObjectQuery($"SELECT * FROM Win32_Share WHERE Name = '{shareName.Replace("'", "''")}'"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); foreach (ManagementObject share in searcher.Get()) { shares.Add(share["Name"].ToString(), share["Path"].ToString()); } return shares; } } }
注意事项
- 对传入的共享名做单引号转义(将单引号替换为两个单引号),可避免共享名包含单引号时再次触发查询语法错误
- 访问远程主机WMI接口时,运行程序的当前账号需要对目标服务器有本地管理员或WMI查询权限,否则会抛出访问拒绝类异常
- 若需要实现模糊匹配共享名的逻辑,可将查询条件修改为
WHERE Name LIKE '%{转义后的shareName}%',但该逻辑会匹配所有名称包含目标字符串的共享,结果可能超出预期
内容的提问来源于stack exchange,提问作者prider
相关产品推荐
相关产品推荐

