You need to enable JavaScript to run this app. C#通过WMI按共享名查询本地物理路径时WQL报无效查询异常
优惠活动
大模型
产品
解决方案
定价
更多

C#通过WMI按共享名查询本地物理路径时WQL报无效查询异常

异常触发原因
  • 构造的WQL(WMI查询语言)字符串存在致命语法错误,直接导致WMI引擎无法解析:
    1. 语句内容重复拼接了两段Select查询,出现where Path likeSelect * from Win32_Share的非法片段,完全不符合WQL语法规则
    2. C#字符串拼接逻辑残缺,拼接shareName变量时遗漏了+连接符,最终生成的查询语句语义混乱、结构残缺
  • 上述问题直接触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 08:15:06