2009-02-13 97 views
1

我一直负责找出是什么原因造成的问题与这段代码:虚拟服务器IIS WMI问题

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服务调用?

任何帮助,将不胜感激。


UPDATE:经过多次电话时间都不同程度的MS支持,the've得出的结论,这是“作为设计的”。

由于它在虚拟网络适配器驱动程序的驱动程序级别上,答案是我们应该更改我们的代码以“解决该问题”。

这意味着你不能可靠的测试代码在虚拟服务器上,除非您提供了使用在物理服务器上,因为我们不能保证服务器是精确复制品相同的代码...

+0

第一个错误导致了什么? – Tomalak 2009-02-13 22:49:11

回答

1

好了,所以我写了这个代码来测试问题:

public void GetWin32_NetworkAdapter() 
{ 
    DataTable dt = new DataTable(); 
    dt.Columns.Add("AdapterName", typeof(string)); 
    dt.Columns.Add("ServiceName", typeof(string)); 
    dt.Columns.Add("AdapterType", typeof(string)); 
    dt.Columns.Add("IPEnabled", typeof(bool)); 
    dt.Columns.Add("MacAddress", typeof(string)); 

    //Try getting it by Win32_NetworkAdapterConfiguration 


    ManagementClass mgmt = new ManagementClass("Win32_NetworkAdapter"); 
    EnumerationOptions options = new EnumerationOptions(); 
    options.EnumerateDeep = true; 

    ManagementObjectCollection objCol = mgmt.GetInstances(options); 

    foreach (ManagementObject obj in objCol) 
    { 
     DataRow dr = dt.NewRow(); 
     dr["AdapterName"] = obj["Caption"].ToString(); 
     dr["ServiceName"] = obj["ServiceName"].ToString(); 
     dr["AdapterType"] = obj["AdapterType"]; 
     dr["IPEnabled"] = (bool)obj["IPEnabled"]; 
     if (obj["MacAddress"] != null) 
     { 
      dr["MacAddress"] = obj["MacAddress"].ToString(); 
     } 
     else 
     { 
      dr["MacAddress"] = "none"; 
     } 
     dt.Rows.Add(dr); 
    } 

    gvConfig.DataSource = dt; 
    gvConfig.DataBind(); 

} 

当它在物理IIS箱我得到这个运行: Physical IIS server http://img14.imageshack.us/img14/8098/physicaloutput.gif

虚拟IIS服务器上相同的代码: Virtual server http://img25.imageshack.us/img25/4391/virtualoutput.gif

看到区别?它在第一行。虚拟服务器不返回“AdapterType”字符串。这就是原始代码失败的原因。

这引出了一个有趣的想法。如果虚拟服务器应该是真正的IIS服务器的“虚拟”表示,为什么它不返回相同的值?

0

为什么是两个返回不同的结果?由于用户帐户不同,可能会从控制台和服务中获得不同的结果。

为什么(1)失败和(2)工作?适配器类型的空结果可能返回空值吗?如果是这样,代码是否会处理这种情况?