【问题标题】:Querying the size of a drive on a remote server is giving me a not found error查询远程服务器上驱动器的大小给了我一个未找到的错误
【发布时间】:2012-11-15 16:58:28
【问题描述】:

这是我所拥有的:

public static bool DriveHasLessThanTenPercentFreeSpace(string server)
{
    long driveSize = 0;
    long freeSpace = 0;

    var oConn = new ConnectionOptions {Username = "username", Password = Settings.Default.SQLServerAdminPassword};
    var scope = new ManagementScope("\\\\" + server + "\\root\\CIMV2", oConn);
    scope.Connect();

    var query = new ObjectQuery("SELECT FreeSpace FROM Win32_LogicalDisk where DeviceID = 'D:'");

    var searcher = new ManagementObjectSearcher(scope, query);
    ManagementObjectCollection queryCollection = searcher.Get();
    foreach (ManagementObject m in queryCollection)
    {
        //the FreeSpace value is in bytes
        freeSpace = Convert.ToInt64(m["FreeSpace"]);

        //error happens here!
        driveSize = Convert.ToInt64(m["Size"]);
    }

    long percentFree = ((freeSpace / driveSize) * 100);
    if (percentFree < 10)
    {
        return true;
    }
    return false;
}

这行代码给了我一个错误:

driveSize = Convert.ToInt64(m["Size"]);

错误提示:

ManagementException was unhandled by user code

找不到

我假设获取驱动器大小的查询是错误的。

请注意,我在该行获取 freeSpace 值:

freeSpace = Convert.ToInt64(m["FreeSpace"]);

所以我知道该查询适用于 freeSpace。

谁能帮帮我?

【问题讨论】:

  • 我想我发现了问题所在...我需要执行 SELECT * 的查询,而不仅仅是 SELECT FreeSpace ...

标签: c# .net wmi


【解决方案1】:

您的查询中必须是SELECT * FROM Win32_LogicalDisk...。

因为您在查询中选择了“FreeSpace”,但将返回可用空间,其他所有内容都会引发异常。

如果您不想返回所有内容(因为它是远程查询),您有几个选择:

  • 我不确定管理层是否允许您只选择两个项目?我不熟悉语法。不过你可以试试SELECT FreeSpace, Size FROM Win32_LogicalDisk...
  • 如果没有,您可以简单地进行两次查询,一次查询可用空间,另一次查询大小。

【讨论】:

  • ....I'm not sure if management will allow you to select only two items? A:可以,WQL语言支持选择一组属性,所以OP可以写成这样SELECT FreeSpace, Size FROM Win32_LogicalDisk where DeviceID = 'D:'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多