C++通过WMI查询SQL Server FilestreamSettings返回空结果的问题求助
按优先级从高到低验证以下问题,所有场景的表现都和你描述的无结果现象匹配:
已排除因素说明
故障环境上FileStream未启用,不是导致查询无结果的原因:FilestreamSettings类的实例是绑定SQL Server服务实例存在的,和FileStream功能是否开启无关,你用wbemtest能正常拿到2条结果,已经验证了类实例的存在性。缺失WMI代理安全配置
代码注释中提到需要在ConnectServer成功后设置proxy blanket,但多数WMI开发新手抄示例时会遗漏这步。Win10环境COM默认安全策略宽松,漏配这行也能正常拉取实例;但Win7环境严格执行DCOM权限校验,未正确设置代理时,只会在拉取实例环节被静默拦截,表现为ExecQuery成功创建枚举器,但Next调用永远返回uReturn=0、S_FALSE,不会抛出任何权限类错误。
需要在ExecQuery前插入对应代理设置代码:CoSetProxyBlanket( pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE );运行权限与WMI命名空间权限不匹配
故障环境下用wbemtest能拿到2条正确结果,通常是因为wbemtest以管理员权限启动,而实际运行的C++程序是普通用户权限。SQL Server专属的ComputerManagement系列WMI命名空间,默认不开放普通用户的实例枚举权限,这种权限不足场景不会触发“拒绝访问”报错,只会返回空枚举结果,和你遇到的现象完全吻合。
可以先将程序右键选择“以管理员身份运行”测试,如果能正常返回实例,就需要手动配置对应WMI命名空间的安全规则,给程序运行账号添加实例读取权限。查询标志与老版本WMI提供程序兼容性问题
故障环境为SQL Server 2008,对应的WMI提供程序版本较老,对异步查询的支持不完善。当前代码使用的WBEM_FLAG_RETURN_IMMEDIATELY标志要求查询接口不等待枚举完成就立即返回,在老版本提供程序上很容易出现实例未加载完全就返回S_FALSE的情况。可以将查询标志替换为同步等待模式测试:// 原查询标志:WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY // 替换为同步等待完成的标志 WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_WBEM_COMPLETE代码逻辑错误影响结果判断
代码中存在两处会干扰结果判断的问题:- 实例名比较写法错误:
_bstr_t('MyInstance')使用单引号包裹内容,在C++中属于多字符常量,不是有效宽字符串,即使后续拿到了实例,比较逻辑也永远无法匹配成功,需要改为_bstr_t(L"MyInstance")。 - 调用Next之前需要将
pObjInstance显式初始化为NULL,避免未初始化的野指针干扰返回值判断。
- 实例名比较写法错误:
内容的提问来源于stack exchange,提问作者Dennis

