Pergunta

I recebeu a missão de descobrir o que está causando um problema com este pedaço 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;
}

Em nosso (Win2003) servidores virtuais, isso funciona quando executado como parte de um aplicativo de console, mas não de um serviço web em execução no IIS (na mesma máquina).

Como alternativa, eu posso usar esse código em um serviço web no IIS (no servidor virtual) e obter os valores de retorno corretos:

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 que o segundo trabalho um e não o primeiro?

Por que só quando chamado através de um serviço web IIS em uma máquina virtual?

Qualquer ajuda seria apreciada.


UPDATE:. Depois de muito tempo por telefone com todos os diferentes níveis de suporte MS, the've chegar à conclusão de que este é "como projetado"

Uma vez que está em um nível driver para o driver do adaptador de rede virtual, a resposta foi que devemos mudar nosso código "para contornar o problema".

Isto significa que você não pode confiável código de teste em servidores virtuais a menos que você com o mesmo código que você usa em servidores físicos, uma vez que não pode garantir que os servidores são réplicas exatas da ...

Foi útil?

Solução

Ok, então eu escrevi este código para testar a questão:

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

}

Quando ele é executado em um IIS físicos caixa fico com esta: Física servidor IIS http://img14.imageshack.us/img14/8098/physicaloutput.gif

O mesmo código no servidor IIS Virtual: servidor virtual http://img25.imageshack.us/img25/4391/virtualoutput.gif

Veja a diferença? É na primeira linha. O servidor virtual não retorna a string "AdapterType". É por isso que o código original estava falhando.

Isso traz um pensamento interessante. Se Virtual Server é suposto ser uma representação "virtual" de um servidor IIS real, por que não retornam os mesmos valores?

Outras dicas

Por que os dois retornando resultados diferentes? É possível que, devido às diferentes contas de usuário, você vai obter resultados diferentes em execução a partir do console e de um serviço.

Por que (1) falhar e trabalho (2)? É possível que um resultado nulo para AdapterType retornar um valor nulo? Se assim for, seria a alça código esta condição?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top