2009-11-13 2 views
1

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

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

[Изменить] И обнаружить это из Win32? Возможно, настройка реестра?

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

Doug

ответ

0

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

+0

Да ладно. Это хороший вопрос, который заслуживает некоторых голосов! –

0

Любой конкретный язык, который вы ищете?

Возможно, у вас есть возможность использовать failover cluster cmdlets for Powershell (для Windows Server 2008 R2). В частности, Get-Cluster и Get-ClusterNode

+0

Спасибо. Мне нужно это для Win32, но это отправная точка для меня, по крайней мере, посмотреть. – DougN

0

Перейдите на страницу msdn.microsoft.com и выполните поиск «Кластеризация Windows».

Там тонна информации.

2

Вы можете использовать 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); 
     } 
    } 
} 

Я нашел этот код here и немного прибрал его.

+0

И это хороший ответ! –

Смежные вопросы