Frage

Ich habe mit herauszufinden, damit beauftragt, was mit diesem Stück Code ein Problem verursacht:

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

Auf unserem (Win2003) virtuellen Server, dies funktioniert, wenn sie als Teil einer Konsolenanwendung laufen, aber nicht von einem Webdienst auf IIS ausgeführt wird (auf der gleiche Maschine).

Alternativ kann ich diesen Code in einem Web-Dienst auf IIS verwenden (auf dem virtuellen Server) und die korrekten Rückgabewert erhalten:

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

Warum wird die zweite Arbeit und nicht der erste?

Warum nur, wenn sie durch eine IIS-Dienst auf einer virtuellen Maschine namens?

Jede mögliche Hilfe würde geschätzt.


UPDATE: Nach vielen Telefon Zeit mit allen verschiedenen Ebenen der MS Support kommen the've zu dem Schluss, dass dies "As Designed"

.

Da es auf einem Treiberebene für die virtuellen Netzwerk-Adapter-Treiber, die Antwort war, dass wir unseren Code ändern sollten „um das Problem zu arbeiten“.

Das bedeutet, dass Sie nicht zuverlässig Testcode auf virtuellen Servern, wenn Sie mit dem gleichen Code, den Sie auf physischen Servern verwenden, da wir nicht garantieren können, dass die Server exakte Kopien sind ...

War es hilfreich?

Lösung

Okay, so schrieb ich diesen Code, um das Problem zu testen:

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

}

Wenn es auf einem physischen IIS-Box laufen gelassen ich dieses: Physical IIS-Server http://img14.imageshack.us/img14/8098/physicaloutput.gif

Das gleiche Code auf virtuellen IIS-Server: Virtueller Server http://img25.imageshack.us/img25/4391/virtualoutput.gif

Sehen Sie einen Unterschied? Es ist in der ersten Zeile. Der virtuelle Server gibt nicht die „Adaptertype“ string. Welches ist, warum der ursprüngliche Code versagt.

Das bringt einen interessanten Gedanken auf. Wenn Virtual Server soll eine „virtuelle“ Darstellung eines realen IIS-Server sein, warum es nicht die gleichen Werte zurück?

Andere Tipps

Warum kehren die zwei unterschiedliche Ergebnisse? Es ist möglich, dass aufgrund der unterschiedlichen Benutzerkonten, werden Sie von der Konsole und von einem Dienst unterschiedliche Ergebnisse erhalten.

Warum (1) fehlschlagen und (2) arbeiten? Ist es möglich, dass ein Nullergebnis für adapter einen Nullwert zurückgeben? Wenn ja, würde diese Bedingung der Code umgehen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top