user1865670
user1865670

Reputation:

Getting drive info from a remote computer

I can view a remotly connected pc from this article:Remote Desktop using c-net . but i dont need it. I just have to connect with that pc and get the free space data of C drive. How could i do this? I can connect to a remote desktop. I can get driveInfo using IO namespace. but how to combine them?

Upvotes: 11

Views: 25302

Answers (3)

Thomas C. G. de Vilhena
Thomas C. G. de Vilhena

Reputation: 14595

After losing a full day trying to make WMI work remotely without success I discovered an alternative using performance counters. Simply check the Free Megabytes counter in the LogicalDisk category using the desired drive letter (appended by ":") as the instance name to get an updated reading of the drive's available free space:

"LogicalDisk(C:)\Free Megabytes"

You can access it programmatically in C# through the PerformanceCounter Class.

For accessing it remotely you'll need to specify the server name to the performance counter class constructor and the impersonated account must be added to the "Performance Monitor Users" group:

net localgroup "Performance Monitor Users" %username% /add

Upvotes: 0

Alessandro Bernardi
Alessandro Bernardi

Reputation: 399

Here is the vb.net equivalent in case you need to translate it.

        Dim path = New ManagementPath With {.NamespacePath = "root\cimv2",
                                          .Server = "<REMOTE HOST OR IP>"}
    Dim scope = New ManagementScope(path)
    Dim condition = "DriveLetter = 'C:'"
    Dim selectedProperties = {"FreeSpace"}
    Dim query = New SelectQuery("Win32_Volume", condition, selectedProperties)
    Dim searcher = New ManagementObjectSearcher(scope, query)
    Dim results = searcher.Get()
    Dim volume = results.Cast(Of ManagementObject).SingleOrDefault()
    If volume IsNot Nothing Then
        Dim freeSpace As ULong = volume.GetPropertyValue("FreeSpace")

    End If

Upvotes: -1

Lance U. Matthews
Lance U. Matthews

Reputation: 16612

Use the System.Management namespace and Win32_Volume WMI class for this. You can query for an instance with a DriveLetter of C: and retrieve its FreeSpace property as follows:

ManagementPath path = new ManagementPath() {
    NamespacePath = @"root\cimv2",
    Server = "<REMOTE HOST OR IP>"
};
ManagementScope scope = new ManagementScope(path);
string condition = "DriveLetter = 'C:'";
string[] selectedProperties = new string[] { "FreeSpace" };
SelectQuery query = new SelectQuery("Win32_Volume", condition, selectedProperties);

using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query))
using (ManagementObjectCollection results = searcher.Get())
{
    ManagementObject volume = results.Cast<ManagementObject>().SingleOrDefault();

    if (volume != null)
    {
        ulong freeSpace = (ulong) volume.GetPropertyValue("FreeSpace");

        // Use freeSpace here...
    }
}

There is also a Capacity property that stores the total size of the volume.

Upvotes: 26

Related Questions