SQL 服务器 FilestreamSettings 的 WMI 查询

WMI Query for SQL Server FilestreamSettings

根据我在 Internet 上可以找到的内容,这似乎不是很多人会做的事情,但我很困惑,所以我会把它放在这里。我在 C++ 中使用 WMI 来尝试操作 SQL 服务器设置。我的以下代码不是 return 我的 WMI 查询的结果,我不知道为什么:

hr = pLoc->ConnectServer(CComBSTR(L"root\Microsoft\SqlServer\ComputerManagement10"), // Object path of WMI namespace
    NULL,           // User name. NULL = current user
    NULL,           // User password. NULL = current
    0,          // Locale. NULL indicates current
    NULL,           // Security flags
    0,          // Authority (e.g. Kerberos)
    0,          // Context object
    &pSvc);

// ----- Check for success and set proxy blanket here -----

IEnumWbemClassObject* pClassEnum = 0;
hr = pSvc->ExecQuery(_bstr_t("WQL"), _bstr_t("SELECT * FROM FilestreamSettings"), 
    WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
    NULL,
    &pClassEnum);
if (SUCCEEDED(hr) && pClassEnum)
{
    ULONG uReturn = 0;
                    
    while (pClassEnum && !myInstanceFound)
    {
        hr = pClassEnum->Next(WBEM_INFINITE, 1, &pObjInstance, &uReturn);

        if (0 == uReturn || !pObjInstance)
        {
            break;
        }

        // Get the value of the InstanceName property - the SQL Server instance name
        CComVariant vtProp;
        hr = pObjInstance->Get(L"InstanceName", 0, &vtProp, 0, 0);
        if (SUCCEEDED(hr) && (VT_BSTR) == vtProp.vt)
        {
            if (vtProp.bstrVal == _bstr_t('MyInstance'))
            {
                myInstanceFound = true;
            }
        }
    }
.
.
.
}

ExecQuery 命令成功。 pClassEnum 枚举器对象不为空,因此执行 while 循环。但是,对 'Next' 的调用不会 return 对象(pObjectInstance 为空)并且 &uReturn 为 0(据我了解,这意味着对 'Next' [=27= 的调用]ed 0 个结果)。但是,如果我在 wbemtest 工具中 运行 相同的查询,我会得到两个结果(这是正确的,因为我在这台机器上有 2 个 SQL 服务器实例)。我的 C++ 技能有限,这是我第一次使用 WMI。我不仅看不出这里有什么问题,我什至不确定还能尝试什么。我见过的几个代码示例表明这段代码应该是正确的。任何帮助将不胜感激!

谢谢, 丹尼斯

更新:对 Next() 的调用实际上 returns S_FALSE。其中,如果我正确阅读文档,主要只是确认没有得到结果的问题。 Next() returns S_FALSE 如果少于请求的结果数(在我的例子中,少于 1 - 或者换句话说,0)。

更新 #2:同样的代码在我的笔记本电脑上确实有效(好吧,Next() 调用无论如何都有效)。不同之处在于:在我的笔记本电脑上工作 - Win 10,Sql Server 2019(必须将命名空间更改为 ComputerManagement15 而不是 10),FileStream 已启用。不起作用 - Win 7 VM,Sql Server 2008,未启用 FileStream。在这两种情况下,使用 Wbemtest 工具的查询都会获得正确的数据。只是想我会 post 以防万一这有帮助。

仅供参考,以防万一有人偶然发现:我没有在技术上解决这个问题,因为我从来没有让我的 C++ 代码工作。我使用 SQL 服务器管理对象(基本上是 WMI 的包装器)编写了一些 C# 代码,并将其制作成我可以从 C++ 调用的 COM 服务器。即使这样也不能直接工作,因为即使我 运行 C++ COM 客户端应用程序作为管理员,我的 C# COM 服务器仍然收到“拒绝访问”。最终起作用的是将 SSMO 代码提取到它自己的 C# 控制台应用程序中,然后我使用“运行 as”动词从我的 C# COM 服务器 运行 作为它自己的进程,这样它将 运行 作为管理员。这最终成功地在我的 SQL 服务器实例上启用了 Filestream。可能有 better/easier 方法可以完成此操作,但我发现了一些有用的方法(尽管它很笨拙)。因此,如果这有可能对其他人有所帮助,我会把它放在那里。