我有一个工作程序,可以从远程服务器检索磁盘信息,例如FreeSpace,TotalSpace等。但是我有一个问题,我无法获得服务器上配置的所有群集磁盘的相同统计信息。该查询仅返回本地磁盘(逻辑磁盘)的信息。
我能够获得本地磁盘(:C)的大小,如下所示:
public List<Disk> GetEnvironmentStatistics()
{
var serverIP = Convert.ToString(System.Web.HttpContext.Current.Session["ServerIP"]);
List<Disk> diskinfo = new List<Disk>();
//Add System.Management to access these utilities
ConnectionOptions options = new ConnectionOptions
{
Username = Convert.ToString(System.Web.HttpContext.Current.Session["Username"]),
Password = Convert.ToString(System.Web.HttpContext.Current.Session["Password"]),
Authority = Convert.ToString(System.Web.HttpContext.Current.Session["Authority"]),
};
//root - root of the tree, cimv2 - version
ManagementScope scope = new ManagementScope("\\\\" + serverIP + "\\root\\CIMV2", options);
scope.Connect();
SelectQuery query = new SelectQuery("Select * from Win32_LogicalDisk");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection queryCollection = searcher.Get();
foreach (ManagementObject mo in queryCollection)
{
Disk disk = new Disk();
disk.DiskName = mo["Name"].ToString();
disk.DeviceId = mo["DeviceID"].ToString();
disk.SystemName = mo["SystemName"].ToString();
disk.FreeSpace = Convert.ToDecimal(mo["FreeSpace"]);
var formattedFreeSpace = Helpers.DiskSpaceInGigabytes(disk.FreeSpace ?? 0);
disk.FreeSpace = Decimal.Truncate(formattedFreeSpace);
disk.TotalSpace = Convert.ToDecimal(mo["Size"]);
var formattedTotalSpace = Helpers.DiskSpaceInGigabytes(disk.TotalSpace ?? 0);
disk.TotalSpace = Decimal.Truncate(formattedTotalSpace);
disk.UsedSpace = disk.TotalSpace - disk.FreeSpace;
var HDPercentageUsed = 100 - (100 * disk.FreeSpace / disk.TotalSpace);
disk.PercentageUsed = Convert.ToInt32(HDPercentageUsed);
diskinfo.Add(disk);
}
return diskinfo;
}
我已经登录到服务器,并注意到其他磁盘显示为“群集磁盘”。
我对集群磁盘或集群共享卷进行了一些研究,但我看到的唯一指南包括Powershell脚本,例如:ClusteredSharedVolume Disk Space。
我的问题-我如何编写一个WMI查询,该查询还可以检索群集磁盘的信息。准确地讲,我如何适应提供的链接中的查询以满足我的需求:
$resources = Get-WmiObject -namespace root\MSCluster MSCluster_Resource -filter "Type='Physical
Disk'"
$resources | foreach {
$res = $_
$disks = $res.GetRelated("MSCluster_Disk")
$disks | foreach {
$_.GetRelated("MSCluster_DiskPartition") |
select @{N="Name"; E={$res.Name}}, @{N="Status"; E={$res.State}}, Path, VolumeLabel, TotalSize, FreeSpace
}
} | ft
答案 0 :(得分:-1)
该解决方案需要在C#中调用Powershell脚本:
1。添加System.Management.Automation参考
此dll允许访问Powershell实用程序。 Nuget上可用的软件包似乎在前面并且未被识别,因此我不得不手动添加按引用进行引用>>添加引用>>浏览>> C:\ Windows \ assembly \ GAC_MSIL \ System.Management.Automation \ 1.0.0.0__31bf3856ad364e35
使用Powershell,我可以通过以下命令获取所有群集磁盘的磁盘信息:
get-WmiObject win32_logicaldisk -Computername (ComputerName or IPAddress here)
2。在代码中调用此命令 我添加了一种扩展方法,用于检查远程主机是否具有群集磁盘(如果有)。如果确实存在,请使用Powershell脚本,否则请使用常规WMI查询:
public List<Disk> GetEnvironmentStatistics()
{
List<Disk> diskinfo = new List<Disk>();
var serverIP = Convert.ToString(System.Web.HttpContext.Current.Session["ServerIP"]);
var clusterDisksStatus = CheckForClusteredDisks(serverIP);
if (Helpers.HasClusteredDisks(clusterDisksStatus))
{
string getClusterSharedVolumesStatistics = "get-WmiObject win32_logicaldisk -Computername " + serverIP + "";
PowerShell ps = PowerShell.Create();
ps.AddScript(getClusterSharedVolumesStatistics);
var results = ps.Invoke();
foreach (var psobject in results)
{
if (psobject != null)
{
Disk clusteredDisk = new Disk();
clusteredDisk.DiskName = Convert.ToString(psobject.Members["DeviceID"].Value);
clusteredDisk.FreeSpace = Convert.ToDecimal(psobject.Members["FreeSpace"].Value);
var formattedFreeSpace = Helpers.DiskSpaceInGigabytes(clusteredDisk.FreeSpace ?? 0);
clusteredDisk.FreeSpace = Decimal.Truncate(formattedFreeSpace);
clusteredDisk.TotalSpace = Convert.ToDecimal(psobject.Members["Size"].Value);
var formattedTotalSpace = Helpers.DiskSpaceInGigabytes(clusteredDisk.TotalSpace ?? 0);
clusteredDisk.TotalSpace = Decimal.Truncate(formattedTotalSpace);
clusteredDisk.UsedSpace = clusteredDisk.TotalSpace - clusteredDisk.FreeSpace;
clusteredDisk.VolumeName = Convert.ToString(psobject.Members["VolumeName"].Value);
diskinfo.Add(clusteredDisk);
}
}
}
else
{
//Add System.Management to access these utilities
ConnectionOptions options = new ConnectionOptions
{
Username = Convert.ToString(System.Web.HttpContext.Current.Session["Username"]),
Password = Convert.ToString(System.Web.HttpContext.Current.Session["Password"]),
Authority = Convert.ToString(System.Web.HttpContext.Current.Session["Authority"]),
};
//root - root of the tree, cimv2 - version
ManagementScope scope = new ManagementScope("\\\\" + serverIP + "\\root\\CIMV2", options);
scope.Connect();
SelectQuery query = new SelectQuery("Select * from Win32_LogicalDisk");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection queryCollection = searcher.Get();
try
{
foreach (ManagementObject mo in queryCollection)
{
Disk disk = new Disk();
disk.DiskName = mo["Name"].ToString();
disk.DeviceId = mo["DeviceID"].ToString();
disk.SystemName = mo["SystemName"].ToString();
disk.FreeSpace = Convert.ToDecimal(mo["FreeSpace"]);
var formattedFreeSpace = Helpers.DiskSpaceInGigabytes(disk.FreeSpace ?? 0);
disk.FreeSpace = Decimal.Truncate(formattedFreeSpace);
disk.TotalSpace = Convert.ToDecimal(mo["Size"]);
var formattedTotalSpace = Helpers.DiskSpaceInGigabytes(disk.TotalSpace ?? 0);
disk.TotalSpace = Decimal.Truncate(formattedTotalSpace);
disk.UsedSpace = disk.TotalSpace - disk.FreeSpace;
var HDPercentageUsed = 100 - (100 * disk.FreeSpace / disk.TotalSpace);
disk.PercentageUsed = Convert.ToInt32(HDPercentageUsed);
diskinfo.Add(disk);
}
}
catch (DivideByZeroException ex)
{
ExceptionLogger.SendErrorToText(ex);
}
}
return diskinfo;
}
以及用于检查的Helper方法:
public static bool HasClusteredDisks(int status)
{
int hasClusteredDisks = 1;
if (status == hasClusteredDisks)
{
return true;
}
else
{
return false;
}
}