C# 4.0 如何获取群集磁盘的磁盘空间统计信息

C# 4.0 如何获取群集磁盘的磁盘空间统计信息,c#-4.0,wmi,C# 4.0,Wmi,我有一个工作程序,可以从远程服务器检索磁盘信息,如空闲空间、总空间等。但是,我有一个问题,就是无法获得服务器上配置的所有群集磁盘的相同统计信息。查询仅返回本地磁盘(逻辑磁盘)的信息 我可以获得本地磁盘(:C)的大小,如下所示: public List<Disk> GetEnvironmentStatistics() { var serverIP = Convert.ToString(System.Web.HttpContext.Current.Sess

我有一个工作程序,可以从远程服务器检索磁盘信息,如空闲空间、总空间等。但是,我有一个问题,就是无法获得服务器上配置的所有群集磁盘的相同统计信息。查询仅返回本地磁盘(逻辑磁盘)的信息

我可以获得本地磁盘(: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;
    }

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

1。添加System.Management.Automation参考文件

此dll允许访问Powershell实用程序。Nuget上可用的软件包似乎在前面,无法识别,因此我不得不手动添加引用>>添加引用>>浏览>>C:\Windows\assembly\GAC\U MSIL\System.Management.Automation\1.0.0\uUu 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;
    }
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;
    }
 public static bool HasClusteredDisks(int status)
    {
        int hasClusteredDisks = 1;
        if (status == hasClusteredDisks)
        {
            return true;
        }
        else
        {
            return false;
        }
    }