无法计算函数调用超时

时间:2009-07-25 23:49:56

标签: c# wmi

我在C#中编写了一些基本代码,如下所示:

//Connection credentials to the remote computer - not needed if the logged in account has access
ConnectionOptions oConn = new ConnectionOptions();
oConn.Username = "";
oConn.Password = "";

System.Management.ManagementScope oMs = new System.Management.ManagementScope("\\MachineX", oConn);    

//get Fixed disk stats
System.Management.ObjectQuery oQuery = new System.Management.ObjectQuery("select FreeSpace,Size,Name from Win32_LogicalDisk where DriveType=3");

//Execute the query 
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs,oQuery);

//Get the results
ManagementObjectCollection oReturnCollection = oSearcher.Get();   

//loop through found drives and write out info
foreach( ManagementObject oReturn in oReturnCollection )
{
    // Disk name
    Console.WriteLine("Name : " + oReturn["Name"].ToString());
    // Free Space in bytes
    Console.WriteLine("FreeSpace: " + oReturn["FreeSpace"].ToString());
    // Size in bytes
    Console.WriteLine("Size: " + oReturn["Size"].ToString());
} 

用户名和密码作为本地桌面帐户的凭据提供。

当我到达从ManagementObjectSearcher Get()方法返回ManagementObjectCollection类型的行时,我得到一个错误(在运行时),当我尝试评估此行时,函数调用超时(foreach循环之前的最后一行) )。

没有例外,所以没有关于错误的详细信息。

我该如何解决这个问题?代码看起来很好吗?这段代码在另一台机器上,所以我使用的是这里的代码(几乎遵循相同的步骤):http://www.csharphelp.com/archives2/archive334.html

由于

2 个答案:

答案 0 :(得分:2)

运行代码时出现此异常:

System.Management.ManagementException未处理   Message =“用户凭据不能用于本地连接”   来源= “System.Management” ...

它是在使用oSearcher.Get()的行上引发的,但问题是WMI连接,因为尝试连接到本地计算机。如果在oMs初始化后添加此行:

Console.WriteLine(oMs.Path.Path);

输出将是这样的(与以前相同的例外):

\。\ MachineX

因此您的路径被解释为本地(点)计算机上名为MachineX的WMI命名空间。这是由于C#转义规则 - 您可以将其用于oMs初始化(没有oConn,因为凭据不能用于本地WMI连接):

System.Management.ManagementScope oMs = 
new System.Management.ManagementScope("\\root\\cimv2");

您将在本地连接到Root \ Cimv2名称空间。始终使用完整的WMI路径是一个好习惯:

System.Management.ManagementScope oMs = 
new System.Management.ManagementScope(@"\\MachineX\root\cimv2", oConn);

答案 1 :(得分:1)

根据您提供的链接参考,我看到相同的ManagementScope - \ MachineX - 不应该是您的本地计算机名称 - 将与错误一致(由于找不到范围而超时)?