Мне удалось выяснить это после долгих проб и ошибок, а также обнаружения ошибки API на этом пути.
Оказывается, у объектов кластерных ресурсов есть свойство, называемое PrivateProperties
, которое в основном представляет собой пакет свойств. Внутри есть свойство с именем UseNetworkName
, которое соответствует флажку в пользовательском интерфейсе (а также свойство 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
, см. этот другой ответ для полной информации.