【问题标题】:How do I get disk space statistics for a clustered disk如何获取群集磁盘的磁盘空间统计信息
【发布时间】:2020-06-01 11:13:45
【问题描述】:

我有一个可以从远程服务器检索磁盘信息的工作程序,例如 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

【问题讨论】:

    标签: c#-4.0 wmi


    【解决方案1】:

    解决方案需要在 C# 中调用 Powershell 脚本:

    1.添加 System.Management.Automation 参考

    此 dll 允许访问 Powershell 实用程序。 Nuget 上可用的包似乎提前并且没有被识别,所以我不得不手动添加 Reference by References >> Add Reference >> Browse >> C:\Windows\assembly\GAC_MSIL\System.Management.Automation\1.0.0.0__31bf3856ad364e35

    使用 Powershell 我可以通过以下命令获取所有集群磁盘的磁盘信息:

    get-WmiObject win32_logicaldisk -Computername (ComputerName or IPAddress here)
    

    2。在代码中调用此命令 我添加了一个扩展方法来检查远程主机是否有 Clustered Disks (if any) 。如果确实有,则使用 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;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 2019-12-12
      • 1970-01-01
      相关资源
      最近更新 更多