我在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
由于
答案 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 - 不应该是您的本地计算机名称 - 将与错误一致(由于找不到范围而超时)?