Программно определить конфигурацию кластера Windows?

Кто-нибудь знает, как программно определить, что сервер Windows является частью кластера?

Кроме того, можно ли определить, что сервер является активным или пассивным узлом?

[Изменить] И обнаружить его из Win32? Может параметр реестра?

Спасибо за любое понимание.

Дуг


person DougN    schedule 13.11.2009    source источник


Ответы (3)


У меня нет точного ответа, но есть множество интерфейсов API, начинающихся с «Cluster» (например, ClusterOpenEnum и ClusterNodeEnum), и COM-интерфейсов, начинающихся с «IGetCluster», которые выглядят многообещающе.

person Michael Dunn    schedule 23.11.2009

Вы можете использовать WMI для поиска информации. Это должно работать с XP/Win32 и т. д.

Здесь есть отличная информация об использовании VBScript для выполнения этой работы: http://www.activexperts.com/activmonitor/windowsmanagement/scripts/networking/clustering/

Вот некоторый код C#/.Net, который также использует WMI:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;
using System.Management;

namespace SandboxConsole
{
    public class ClusterAdmin
    {
        [MTAThread]
        public static void Main()
        {
            string clusterName = "MyCluster"; // cluster alias
            string custerGroupResource = "FS_Resource1"; // Cluster group name
            ConnectionOptions options = new ConnectionOptions();
            options.Username = "ClusterAdmin"; //could be in domain\user format
            options.Password = "HisPassword";

            // Connect with the mscluster WMI namespace on the cluster named "MyCluster"
            ManagementScope s = new ManagementScope("\\\\" + clusterName + "\\root\\mscluster", options);
            ManagementPath p = new ManagementPath("Mscluster_Clustergroup.Name='" + custerGroupResource + "'");

            using (ManagementObject clrg = new ManagementObject(s, p, null))
            {
                // Take clustergroup off line and read its status property when done
                TakeOffLine(clrg);
                clrg.Get();
                Console.WriteLine(clrg["Status"]);

                System.Threading.Thread.Sleep(3000); // Sleep for a while

                // Bring back online and get status.
                BringOnLine(clrg);
                clrg.Get();
                Console.WriteLine(clrg["Status"]);
            }
        }
        static void TakeOffLine(ManagementObject resourceGroup)
        {
            ManagementBaseObject outParams =
            resourceGroup.InvokeMethod("Takeoffline", null, null);
        }
        static void BringOnLine(ManagementObject resourceGroup)
        {
            ManagementBaseObject outParams =
            resourceGroup.InvokeMethod("Takeoffline", null, null);
        }
    }
}

Я нашел этот код здесь и немного подправил его.

person Stuntbeaver    schedule 23.11.2009

Какой-то конкретный язык вы ищете?

Вы можете использовать командлеты отказоустойчивого кластера для Powershell (для Windows Server 2008 R2). В частности, Get-Cluster и Get-ClusterNode

person squillman    schedule 13.11.2009
comment
Спасибо. Мне это нужно для Win32, но это отправная точка, на которую я должен хотя бы взглянуть. - person DougN; 14.11.2009