Pregunta

Me han encargado de averiguar qué está causando un problema con este trozo de código:

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;
}

En nuestro (Win2003) servidores virtuales, esto funciona cuando se ejecuta como parte de una aplicación de consola, pero no de un servicio web que se ejecuta en IIS (en la misma máquina).

Como alternativa, puedo usar este código en un servicio web en IIS (en el servidor virtual) y obtener los valores de retorno correctos:

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();
    }
}

¿Por qué el segundo trabajo y no el primero?

¿Por qué sólo cuando se llama a través de un servicio web IIS en una máquina virtual?

Cualquier ayuda sería apreciada.


ACTUALIZACIÓN: Después de mucho tiempo de teléfono con todos los diferentes niveles de MS textuales, the've llegan a la conclusión de que esto es "tal como fue diseñado"

.

Desde que está en un nivel de controlador para el controlador de adaptador de red virtual, la respuesta fue que deberíamos cambiar nuestro código "para evitar el problema".

Esto significa que pueda código de prueba no es fiable en servidores virtuales A menos que tengan el mismo código que se utilizan en servidores físicos, ya que no podemos garantizar que los servidores son réplicas exactas ...

¿Fue útil?

Solución

Muy bien, así que escribí este código para probar el tema:

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();

}

Cuando se ejecuta en un cuadro de IIS física me sale esto: IIS física http://img14.imageshack.us/img14/8098/physicaloutput.gif

El mismo código en el servidor IIS virtual: servidor virtual http://img25.imageshack.us/img25/4391/virtualoutput.gif

Ver una diferencia? Es en la primera línea. El servidor virtual no devuelve la cadena "AdapterType". Por lo que el código original estaba fallando.

Esto nos lleva a una idea interesante. Si el servidor virtual se supone que es una representación "virtual" de un servidor IIS verdadera, ¿por qué no devuelven los mismos valores?

Otros consejos

¿Por qué son los dos regresan resultados diferentes? Es posible que debido a las diferentes cuentas de usuario, obtendrá resultados diferentes que van desde la consola y de un servicio.

¿Por qué (1) fallar y (2) el trabajo? ¿Es posible que un resultado nulo para AdapterType devuelve un valor nulo? Si es así, sería el código de manejar esta condición?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top