我的任务是找出导致这段代码出现问题的原因:
public static ArrayList GetEthernetMacAddresses()
{
ArrayList addresses = new ArrayList();
ManagementClass mc = new ManagementClass("Win32_NetworkAdapter");
// This causes GetInstances(options)
// to return all subclasses of Win32_NetworkAdapter
EnumerationOptions options = new EnumerationOptions();
options.EnumerateDeep = true;
foreach (ManagementObject mo in mc.GetInstances(options)) {
string macAddr = mo["MACAddress"] as string;
string adapterType = mo["AdapterType"] as string;
if (!StringUtil.IsBlank(macAddr) && !StringUtil.IsBlank(adapterType))
{
if (adapterType.StartsWith("Ethernet")) {
addresses.Add(macAddr);
}
}
}
return addresses;
}
在我们的 (Win2003) 虚拟服务器上,这在作为控制台应用程序的一部分运行时有效,但不能从在 IIS 上运行的 Web 服务(在同一台机器上)运行。
或者,我可以在 IIS(虚拟服务器上)的 Web 服务中使用此代码并获得正确的返回值:
public static string GetMacAddresses()
{
ManagementClass mgmt = new ManagementClass(
"Win32_NetworkAdapterConfiguration"
);
ManagementObjectCollection objCol = mgmt.GetInstances();
foreach (ManagementObject obj in objCol)
{
if ((bool)obj["IPEnabled"])
{
if (sb.Length > 0)
{
sb.Append(";");
}
sb.Append(obj["MacAddress"].ToString());
}
obj.Dispose();
}
}
为什么第二个有效而不是第一个?
为什么只在通过虚拟机上的 IIS Web 服务调用时?
任何帮助,将不胜感激。
更新: 在与所有不同级别的 MS 支持打了很多电话之后,我们得出结论,这是“按设计”。
由于它在虚拟网络适配器驱动程序的驱动程序级别上,答案是我们应该更改我们的代码“以解决这个问题”。
这意味着您无法在虚拟服务器上可靠地测试代码,除非您使用在物理服务器上使用的相同代码,因为我们不能保证服务器是精确的副本......