2009-02-13 6 views
1

Я была поставлена ​​задача выяснить, что вызывает проблемы с этим битом кода:Virtual Server 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 (на том же компьютере).

В качестве альтернативы, можно использовать этот код в веб-службы на IIS (на виртуальном сервере) и получить правильные значения возврата:

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 на виртуальной машине?

Любая помощь будет оценена по достоинству.


UPDATE: После долгого времени по телефону со всеми различными уровнями MS поддержки, the've пришел к выводу, что это «как задумано».

Поскольку драйвер находится на уровне драйвера для драйвера виртуального сетевого адаптера, ответ был сделан на то, что мы должны изменить наш код «для решения проблемы».

Это означает, что вы можете не надежный тест код на виртуальных серверах, если вы с тем же кодом, который вы используете на физических серверах, так как мы не можем гарантировать, что серверы являются точными копиями ...

+0

Какая ошибка является результатом первого? – Tomalak

+0

Нет ошибки, просто пустой ArrayList. –

ответ

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) работает? Возможно ли, что нулевой результат для adapterType возвращает нулевое значение? Если да, будет ли код обрабатывать это условие?