无法连接到一个VM上的网络适配器,相同的代码在另一个VM上工作

问题描述:

我需要从网卡获取性能计数器。为了使事情变得容易,用户通过在控制台应用程序中输入索引号来选择所需的适配器。无法连接到一个VM上的网络适配器,相同的代码在另一个VM上工作

Console application

这是获取用户输入并创建性能计数器实例的代码

var connectionNames = NetworkCardLocator.GetConnectedCardNames().ToArray(); 
log.Debug("Please select one of the available connections"); 
log.Debug("--"); 
for (int i = 0; i < connectionNames.Count(); i++) 
{ 
    log.Debug(i + ". " + connectionNames[i]); 
} 
log.Debug("--"); 
var key = Console.ReadLine(); 
int idx = 0; 
Int32.TryParse(key, out idx); 
string connectionName = connectionNames[idx]; 

var networkBytesSent = new PerformanceCounter("Network Interface", "Bytes Sent/sec", connectionName); 
var networkBytesReceived = new PerformanceCounter("Network Interface", "Bytes Received/sec", connectionName); 
var networkBytesTotal = new PerformanceCounter("Network Interface", "Bytes Total/sec", connectionName); 

这是我的选择可用适配器

internal static IEnumerable<string> GetConnectedCardNames() 
{ 
    string query = String.Format(@"SELECT * FROM Win32_NetworkAdapter"); 
    var searcher = new ManagementObjectSearcher 
    { 
     Query = new ObjectQuery(query) 
    }; 

    try 
    { 
     log.Debug("Trying to select network adapters"); 
     var adapterObjects = searcher.Get(); 

     var names = (from ManagementObject o in adapterObjects 
         select o["Name"]) 
          .Cast<string>(); 

     return names; 
    } 
    catch (Exception ex) 
    { 
     log.Debug("Failed to get needed names, see Exception log for details"); 
     log.Fatal(ex); 
     throw; 
    } 
} 

问题
鉴于我选择了所需的适配器,代码在我的机器上运行(Win 2008 R2 Ent x64)。它在我用于测试的某些虚拟机上不起作用(Win 2008 R1 DC x86)。任何选择也给了我一个例外(仍然工作在我的电脑和VM赢2008 R1标准的x86上)

foreach (PerformanceCounter counter in counters) 
{ 
    float rawValue = counter.NextValue(); //thrown here 
    ... 
} 

2011-06-10 11:08:20,505 [10] DEBUG TH.Exceptions Instance 'WAN Miniport (PPTP)' does not exist in the specified Category. 
System.InvalidOperationException: Instance 'WAN Miniport (PPTP)' does not exist in the specified Category. 
    at System.Diagnostics.CounterDefinitionSample.GetInstanceValue(String instanceName) 
    at System.Diagnostics.PerformanceCounter.NextSample() 
    at System.Diagnostics.PerformanceCounter.NextValue() 
    at TH.PerformanceMonitor.API.Internal.PerformanceLogService.DoPerformanceLogging(IEnumerable`1 counters, Int32 interval, TimeSpan duration) in C:\Projects\...\PerformanceLogService.cs:line 122 
    at TH.PerformanceMonitor.API.PerformanceManager.DoPerformanceLogging() in C:\Projects\...\PerformanceManager.cs:line 294 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 

Q
可能是什么问题,或者我怎么可以跟踪的原因为何?

问题出在phantom network adapters。一旦他们从虚拟机中删除,一切都开始奏效。