Можно ли средствами 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"]);
}
Выкладываю свое решение. Получение ресурсов, остановка и запуск ресурсов.
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);
}
}
Попробуйте так (источник) и не забудьте подключить библиотеку 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);
}
}
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей