/// <summary> /// Returns a System.Management.PropertyData[] of properties that will be returned by the system for the specified query string. /// </summary> /// <param name="query">A valid WQL Select query.</param> /// <param name="managementClass">A ManagementBaseObject (class or instance) targeted by this query.</param> /// <returns>A System.Management.PropertyData[] of properties that will be returned by the system for the specified query string.</returns> /// <remarks> /// This function is used to return property data for a query that does not return all of the properties in the associated class. /// Specifically, it is used to build grid column configuration for results returned by a query. /// </remarks> public static PropertyData[] GetWqlQueryProperties(this String query, ManagementBaseObject managementClass) { // Query has been validated Boolean queryValidated = false; // Specified managementClass is a __AggregatedEvent class Boolean classIsAggregatedEvent = managementClass.ClassPath.ClassName.Equals(AGGEVENT_CLASS, StringComparison.InvariantCultureIgnoreCase); // Parse the query with .Net's built in parser var selectQuery = new SelectQuery(query); // Validate an event query WqlEventQuery eventQuery; if (managementClass.IsEvent() || classIsAggregatedEvent) { // Parse the event query with .Net's built in parser eventQuery = new WqlEventQuery(query); // Make sure the return type for an event query with grouped intervals is __AggregateEvent if (eventQuery.GroupWithinInterval.Ticks > 0) { if (!queryValidated && !managementClass.ClassPath.ClassName.Equals(AGGEVENT_CLASS, StringComparison.InvariantCultureIgnoreCase)) { throw new ArgumentException(String.Format("Grouped event queries should return type '{0}'. Object passed was a '{1}'.", AGGEVENT_CLASS, managementClass.ClassPath.ClassName)); } queryValidated = true; } } // Validate class name if (!queryValidated && !selectQuery.ClassName.Equals(managementClass.ClassPath.ClassName, StringComparison.InvariantCultureIgnoreCase)) { throw new ArgumentException(String.Format("The class specified in the query '{0}' does not match the class of the specified object '{1}'.", selectQuery.ClassName, managementClass.ClassPath.ClassName)); } // Extract the list of PropertyData var properties = new List <PropertyData>(); if (selectQuery.SelectedProperties.Count == 0) { // Grab all properties for a SELECT *... query foreach (PropertyData p in managementClass.Properties) { properties.Add(p); } } else { // Grab specified properties for a SELECT field1, field2,... query foreach (var propertyName in selectQuery.SelectedProperties) { properties.Add(managementClass.Properties[propertyName]); } } return(properties.ToArray()); }
/// <summary> /// Gets a WQL query string to perform as basic query of the specified WMI object. /// </summary> /// <param name="managementClass">The WMI object for which a basic query will be returned.</param> /// <returns>A WQL query string to perform as basic query of the specified WMI object.</returns> public static String GetDefaultQuery(this ManagementBaseObject obj) { if (obj.IsEvent()) { return(String.Format("SELECT * FROM {0} WITHIN 5", obj.ClassPath.ClassName)); } else { return(String.Format("SELECT * FROM {0}", obj.ClassPath.ClassName)); } }
/// <summary> /// Returns a System.Management.PropertyData[] of properties that will be returned by the system for the specified query string. /// </summary> /// <param name="query">A valid WQL Select query.</param> /// <param name="managementClass">A ManagementBaseObject (class or instance) targeted by this query.</param> /// <returns>A System.Management.PropertyData[] of properties that will be returned by the system for the specified query string.</returns> /// <remarks> /// This function is used to return property data for a query that does not return all of the properties in the associated class. /// Specifically, it is used to build grid column configuration for results returned by a query. /// </remarks> public static PropertyData[] GetWqlQueryProperties(this String query, ManagementBaseObject managementClass) { // Query has been validated Boolean queryValidated = false; // Specified managementClass is a __AggregatedEvent class Boolean classIsAggregatedEvent = managementClass.ClassPath.ClassName.Equals(AGGEVENT_CLASS, StringComparison.InvariantCultureIgnoreCase); // Parse the query with .Net's built in parser var selectQuery = new SelectQuery(query); // Validate an event query WqlEventQuery eventQuery; if(managementClass.IsEvent() || classIsAggregatedEvent) { // Parse the event query with .Net's built in parser eventQuery = new WqlEventQuery(query); // Make sure the return type for an event query with grouped intervals is __AggregateEvent if (eventQuery.GroupWithinInterval.Ticks > 0) { if (!queryValidated && !managementClass.ClassPath.ClassName.Equals(AGGEVENT_CLASS, StringComparison.InvariantCultureIgnoreCase)) throw new ArgumentException(String.Format("Grouped event queries should return type '{0}'. Object passed was a '{1}'.", AGGEVENT_CLASS, managementClass.ClassPath.ClassName)); queryValidated = true; } } // Validate class name if (!queryValidated && !selectQuery.ClassName.Equals(managementClass.ClassPath.ClassName, StringComparison.InvariantCultureIgnoreCase)) throw new ArgumentException(String.Format("The class specified in the query '{0}' does not match the class of the specified object '{1}'.", selectQuery.ClassName, managementClass.ClassPath.ClassName)); // Extract the list of PropertyData var properties = new List<PropertyData>(); if (selectQuery.SelectedProperties.Count == 0) { // Grab all properties for a SELECT *... query foreach (PropertyData p in managementClass.Properties) { properties.Add(p); } } else { // Grab specified properties for a SELECT field1, field2,... query foreach (var propertyName in selectQuery.SelectedProperties) { properties.Add(managementClass.Properties[propertyName]); } } return properties.ToArray(); }