Подскажите, как программно получить список доступных windows-кластеров (windows server failover cluster),а также узнать список серверов, входящих в кластер?
Пробовал с помощью WinAPI-функции NetServerEnum получать список кластеров, но она не всегда возвращает требуемый результат, иногда завершается ошибкой 6118 (ERROR_NO_BROWSER_SERVERS_FOUND).
Здравствуйте, Vladimir_S, Вы писали:
V_S>Подскажите, как программно получить список доступных windows-кластеров (windows server failover cluster),а также узнать список серверов, входящих в кластер?
Не являюсь специалистом в данной области, поэтому предположу на вскидку, что самым простым может оказаться вариант работы через WMI
Failover Cluster Provider
P.S. Увы, под боком нет подходящего environment, чтобы попробовать самому.
Здравствуйте, Михаил Романов, Вы писали:
МР>Здравствуйте, Vladimir_S, Вы писали:
V_S>>Спасибо, буду пробовать.
МР>Если будет не сложно, поделитесь потом результатми изысканий (кто его знает где и что пригодится)
Вот что у меня получилось:
Список кластеров получаю с помощью WinAPI-функции NetServerEnum, указав при ее вызове для параметра servertype значение SV_TYPE_CLUSTER_NT. Может быть можно и список кластеров найти с помощью WMI, но мне это не удалось.
Далее с помощью WMI получаю требуемую мне информацию. Например, так я получаю список узлов кластера:
string ClusterName = "ClusterName";
string NameSpace = "MSCluster";
System.Management.ConnectionOptions connOptions = new System.Management.ConnectionOptions();
connOptions.Authentication = AuthenticationLevel.PacketPrivacy;
//пользователя и пароль можно не задавать, тогда будет использоваться текущий пользователь
connOptions.Username = "User";
connOptions.Password = "Password";
System.Management.ManagementScope mgmtScope = new System.Management.ManagementScope(string.Format(@"\\{0}\root\{1}", ClusterName, NameSpace), connOptions);
mgmtScope.Connect();
ManagementObjectSearcher searcher = new ManagementObjectSearcher(mgmtScope, new SelectQuery("SELECT * FROM MSCluster_Cluster"));
foreach (ManagementObject queryObj in searcher.Get())
{
Console.WriteLine(string.Format("Cluster Name: \"{0}\"", queryObj["Name"]));
}
Для получения другой информации в запросе WQL (WMI Query Language) надо указать имя требуемого класса.
А если использовать другое пространство имён (NameSpace) при создании mgmtScope, например, CIMV2, то можно получить очень много полезной информации о компьютере и системе.
На сайте Майкрософт есть полезная утилита "WMI Code Creator", которая позволяет просматривать имеющиеся пространства имён и классы, а также генерирует код для получения нужной информации.