Как программно установить флажок для ресурса кластера «Использовать имя сети для имени компьютера»? - PullRequest
0 голосов
/ 15 ноября 2018

Я программно настраиваю ресурс кластера (в частности, универсальную службу), используя Windows MI API (Microsoft.Management.Infrastructure).

Я могу добавить ресурс службы просто отлично. Однако моя служба требует, чтобы флажок «Использовать имя сети для имени компьютера» был установлен (это доступно в пользовательском интерфейсе Cluster Manager при просмотре свойств ресурса).

Я не могу понять, как установить это, используя MI API. Я искал MSDN и несколько других ресурсов для этого без удачи. Кто-нибудь знает, возможно ли это? Сценарии с Powershell тоже подойдут.

1 Ответ

0 голосов
/ 16 ноября 2018

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

...