我正在使用Windows MI API (Microsoft.Management.Infrastructure) 以编程方式设置集群资源(特别是通用服务)。
我可以添加服务资源就好了。但是,我的服务需要选中“使用网络名称作为计算机名称”复选框(通过查看资源的属性可以在集群管理器 UI 中使用)。
我不知道如何使用 MI API 进行设置。我已经搜索了 MSDN 和其他多个资源,但没有运气。有人知道这是否可能吗?使用 Powershell 编写脚本也可以。
我正在使用Windows MI API (Microsoft.Management.Infrastructure) 以编程方式设置集群资源(特别是通用服务)。
我可以添加服务资源就好了。但是,我的服务需要选中“使用网络名称作为计算机名称”复选框(通过查看资源的属性可以在集群管理器 UI 中使用)。
我不知道如何使用 MI API 进行设置。我已经搜索了 MSDN 和其他多个资源,但没有运气。有人知道这是否可能吗?使用 Powershell 编写脚本也可以。
经过大量的试验和错误,并在此过程中发现了一个 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
命令,有关完整信息,请参阅此其他答案。