public void PollWMIQueries() { // Working backwards so we can safely delete queries that fail because of invalid classes. for (int i = WMIQueries.Count - 1; i >= 0; i--) { var thisQuery = WMIQueries[i]; if (String.IsNullOrEmpty(thisQuery.queryString)) { Log.WriteLog(String.Format("Null query removed"), Log.LogLevel.WARN); WMIQueries.RemoveAt(i); continue; } try { string scopeString = "\\\\" + MachineName + "\\" + thisQuery.queryNamespace; if (Scope == null || !Scope.Path.ToString().Equals(scopeString)) { Log.WriteLog("Setting up scope: " + scopeString, Log.LogLevel.VERBOSE); Scope = new ManagementScope(scopeString, RUser.GetConnectionOptions()); } if (!Scope.IsConnected) { Log.WriteLog("Connecting to scope: " + scopeString, Log.LogLevel.VERBOSE); Scope.Connect(); } } catch (Exception e) { Log.WriteLog(String.Format("Unable to connect to \"{0}\". {1}", MachineName, e.Message), Log.LogLevel.ERROR); continue; } try { if (thisQuery.queryType.Equals(WMIQuery)) { Log.WriteLog("Running Query: " + (string)thisQuery.queryString, Log.LogLevel.INFO); var queryResults = (new ManagementObjectSearcher(Scope, new ObjectQuery((string)thisQuery.queryString))).Get(); if (queryResults.Count == 0) { Log.WriteLog(String.Format("Query \"{0}\" returned no results.", thisQuery.queryString), Log.LogLevel.VERBOSE); } foreach (ManagementObject result in queryResults) { { RecordMetricMap(thisQuery, result); continue; } } } else if (thisQuery.queryType.Equals(WMIEvent)) { Log.WriteLog("Running Event Listener: " + thisQuery.queryString, Log.LogLevel.VERBOSE); var watcher = new ManagementEventWatcher(Scope, new EventQuery((string)thisQuery.queryString)).WaitForNextEvent(); RecordMetricMap(thisQuery, watcher); } } catch (ManagementException e) { Log.WriteLog(String.Format("Exception occurred in polling. {0}: {1}", e.Message, (string)thisQuery.queryString), Log.LogLevel.ERROR); if (e.Message.ToLower().Contains("invalid class") || e.Message.ToLower().Contains("not supported")) { Log.WriteLog(String.Format("Query Removed: {0}", thisQuery.queryString), Log.LogLevel.WARN); WMIQueries.RemoveAt(i); } } catch (Exception e) { Log.WriteLog(String.Format("Exception occurred in processing results. {0}\r\n{1}", e.Message, e.StackTrace), Log.LogLevel.ERROR); } } }
public void AddCounter(Counterlist aCounter, int whichCounter) { if (!String.IsNullOrEmpty(aCounter.query)) { if (aCounter.counters != null) { int whichOfTheseCounters = -1; foreach (var testCounter in aCounter.counters) { whichOfTheseCounters++; if (String.IsNullOrEmpty(testCounter.counter)) { Log.WriteLog(String.Format("{0} contains malformed counter: 'counters' in counterlist[{1}] missing 'counter' in element {2}. Please review and compare to template.", fileName, whichCounter, whichOfTheseCounters), Log.LogLevel.ERROR); continue; } } } WMIQueries.Add(new WMIQuery(aCounter.query, aCounter.eventname, aCounter.querytype, aCounter.querynamespace, aCounter.counters)); } else { if (String.IsNullOrEmpty(aCounter.provider) || String.IsNullOrEmpty(aCounter.category)) { Log.WriteLog(String.Format("{0} contains malformed counter: counterlist[{1}] missing 'provider' or 'category'. Please review and compare to template.", fileName, whichCounter), Log.LogLevel.ERROR); } if (aCounter.counters == null) { Log.WriteLog(String.Format("{0} contains malformed counter: counterlist[{1}] missing 'counters'. Please review and compare to template.", fileName, whichCounter), Log.LogLevel.ERROR); } string instanceName = string.Empty; if (!String.IsNullOrEmpty(aCounter.instance) && !String.Equals(aCounter.instance, "*")) { instanceName = aCounter.instance.ToString(); } int whichOfTheseCounters = -1; foreach (var testCounter in aCounter.counters) { whichOfTheseCounters++; if (String.IsNullOrEmpty(testCounter.counter)) { Log.WriteLog(String.Format("{0} contains malformed counter: 'counters' in counterlist[{1}] missing 'counter' in element {2}. Please review and compare to template.", fileName, whichCounter, whichOfTheseCounters), Log.LogLevel.ERROR); continue; } } if (String.Equals(aCounter.provider, PerfCounterType)) { List <string> pcounters = new List <string>(); foreach (var pCounter in aCounter.counters) { pcounters.Add(pCounter.counter); } PerfCounter AddPC = RUser.RunAsRemoteUser <PerfCounter>(() => new PerfCounter(aCounter.category, pcounters, instanceName, MachineName)); PerfCounters.Add(AddPC); } else { string countersStr = ""; foreach (var wCounter in aCounter.counters) { if (String.IsNullOrEmpty(countersStr)) { countersStr = wCounter.counter; } else { countersStr += (", " + wCounter.counter); } } if (!String.IsNullOrEmpty(countersStr)) { WMIQueries.Add(new WMIQuery(aCounter.provider, aCounter.category, countersStr, instanceName)); } } } }