Можно ли средствами C# получить информацию о кластере?

311
11 марта 2017, 00:33

Можно ли средствами C# получить информацию о кластере?
Например получить список ролей и их ресурсы?

Если можно - скиньте ссылку почитать как это сделать.

Пробовал так, но получаю System.Managment.ManagmentException: Invalid class

string clusterName = "app-server.local";
string custerGroupResource = "cluster.server.local";
ConnectionOptions options = new ConnectionOptions
{
    Authentication = AuthenticationLevel.PacketPrivacy
};
ManagementScope s = new ManagementScope("\\\\" + clusterName, options);
ManagementPath p = new ManagementPath("Mscluster_Clustergroup.Name='" + custerGroupResource + "'");
using (ManagementObject clrg = new ManagementObject(s, p, null))
{
    clrg.Get();
    Console.WriteLine(clrg["Status"]);
}
Answer 1

Выкладываю свое решение. Получение ресурсов, остановка и запуск ресурсов.

public class ClusterManager
{
    private readonly string ClusterName;
    private readonly string ClusterNamespace;
    private ManagementScope Scope;
    private readonly ConnectionOptions Options;
    public ClusterManager(string clusterName, string clusterNamespace, string user, string password)
    {
        ClusterName = clusterName;
        ClusterNamespace = clusterNamespace;
        Options = new ConnectionOptions
        {
            Authentication = AuthenticationLevel.PacketPrivacy,
            Username = user,
            Password = password
        };
    }
    public void Connect()
    {
        Scope = new ManagementScope($@"\\{ClusterName}\root\{ClusterNamespace}", Options);
        Scope.Connect();
    }
    public ManagementObject GetResource(string name)
    {
        string wmiClassName = "MSCluster_Resource";
        ManagementClass managementClass = new ManagementClass(Scope, new ManagementPath(wmiClassName), null);
        managementClass.Get();
        ManagementObjectCollection objectCollection = managementClass.GetInstances();
        foreach (ManagementBaseObject obj in objectCollection)
        {
            ManagementObject resource = (ManagementObject) obj;
            if (resource["Name"].ToString() == name)
            {
                return resource;
            }
        }
        return null;
    }
    public void TakeOffline(ManagementObject resource)
    {
        resource.InvokeMethod("Takeoffline", null, null);
    }
    public void BringOnline(ManagementObject resource)
    {
        resource.InvokeMethod("Bringonline", null, null);
    }
}
Answer 2

Попробуйте так (источник) и не забудьте подключить библиотеку System.Management в проект.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;
using System.Management;
namespace  MyNamespace
{
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);
    }
}
}
READ ALSO
как отсортировать одномерный массивна c#

как отсортировать одномерный массивна c#

В одномерном массиве, состоящем из п вещественных элементов, вычислить: произведение положительных элементов массива; сумму элементов массива,...

353
Задержка перехода между страницами в WebBrowser

Задержка перехода между страницами в WebBrowser

Есть некое приложение, которое нажимает кнопки и переходит по этим кнопкам на другие ссылки заполняет input и так далееТак вот есть одна проблема

288
C sharp socket recieve виснет

C sharp socket recieve виснет

Здравствуйте! По какой причине программа может виснуть до получения ответа на string answer = ReceiveDataFromServer();? Те

265
Интеграция Web API и OAuth 2.0 с сайтом, написанным с использованием Razor

Интеграция Web API и OAuth 2.0 с сайтом, написанным с использованием Razor

ЗдравствуйтеЕсть сайт, написанный с использованием синтаксиса Razor

252