1

我正在使用Windows MI API (Microsoft.Management.Infrastructure) 以编程方式设置集群资源(特别是通用服务)。

我可以添加服务资源就好了。但是,我的服务需要选中“使用网络名称作为计算机名称”复选框(通过查看资源的属性可以在集群管理器 UI 中使用)。

我不知道如何使用 MI API 进行设置。我已经搜索了 MSDN 和其他多个资源,但没有运气。有人知道这是否可能吗?使用 Powershell 编写脚本也可以。

4

1 回答 1

1

经过大量的试验和错误,并在此过程中发现了一个 API 错误,我能够弄清楚这一点。

事实证明,集群资源对象有一个名为 的属性PrivateProperties,它基本上是一个属性包。在内部,有一个名为 的属性UseNetworkName,它对应于 UI 中的复选框(还有 ServiceName 属性,它也是工作所必需的)。

'wbemtest' 工具在发现这一点时非常宝贵。在其中打开资源实例后,您必须双击 PrivateProperties 属性以调出一个对话框,该对话框具有“查看嵌入式”按钮,然后会显示其中的属性。不知怎的,我以前错过了这个。

现在,设置这个属性是另一个痛苦。由于API 中的错误,使用 CimSession.GetInstance() 检索资源实例不会填充属性值。这让我误以为我必须自己添加 PrivateProperties 属性及其内部属性,这只会导致许多神秘错误。

我终于偶然发现了这篇关于它的旧 MSDN 帖子,在那里我意识到该属性是动态的并且由 WMI 自动设置。因此,最后,您所要做的就是知道如何使用 CimSession.QueryInstances() 获取属性包,这样您就可以像设置任何其他属性一样设置内部属性。

这就是整个事情的样子(我省略了添加资源的代码):

using (var session = CimSession.Create("YOUR_CLUSTER", new DComSessionOptions()))
{
    // This query finds the newly created resource and fills in the
    // private props we'll change. We have to do a manual WQL query
    // because CimSession.GetInstance doesn't populate prop values.
    var query =
        "SELECT PrivateProperties FROM MSCluster_Resource WHERE Id=\"{YOUR-RES-GUID}\"";

    // Lookup the resource. For some reason QueryInstances does not like
    // the namespace in the regular form - it must be exactly like this
    // for the call to work!
    var res = session.QueryInstances(@"root/mscluster", "WQL", query).First();

    // Add net name dependency so setting UseNetworkName works.
    session.InvokeMethod(
        res,
        "AddDependency",
        new CimMethodParametersCollection
        {
            CimMethodParameter.Create(
                "Resource", "YOUR_NET_NAME_HERE", CimFlags.Parameter)
        });

    // Get private prop bag and set our props.
    var privProps =
        (CimInstance)res.CimInstanceProperties["PrivateProperties"].Value;
    privProps.CimInstanceProperties["ServiceName"].Value = "YOUR_SVC_HERE";
    privProps.CimInstanceProperties["UseNetworkName"].Value = 1;

    // Persist the changes.
    session.ModifyInstance(@"\root\mscluster", res);
}

请注意 API 中的怪癖如何使事情变得比应有的更复杂:QueryInstances 以一种特殊的方式期望命名空间,而且,如果您不首先添加网络名称依赖项,则设置私有属性会静默失败。

最后,我还想出了如何通过 PowerShell 进行设置。您必须使用该Set-ClusterParameter命令,有关完整信息,请参阅此其他答案

于 2018-11-16T20:52:20.557 回答