/// <summary> /// Get information about enabled and disabled windows features. Works on Windows 7 and newer. /// </summary> public static ICollection <WindowsFeatureInfo> GetWindowsFeatures() { var features = new List <WindowsFeatureInfo>(); var searcher = new ManagementObjectSearcher(new ManagementScope(), new ObjectQuery("select * from Win32_OptionalFeature"), new EnumerationOptions(null, TimeSpan.FromSeconds(35), 100, false, false, false, false, false, false, false)); using (var moc = searcher.Get()) { var items = moc.Cast <ManagementObject>().ToList(); foreach (var managementObject in items) { var featureInfo = new WindowsFeatureInfo(); foreach (var property in managementObject.Properties) { if (property.Name == "Caption") { featureInfo.DisplayName = property.Value.ToString(); } else if (property.Name == "InstallState") { var status = (uint)property.Value; if (status == 2) { featureInfo.Enabled = false; } else if (status == 1) { featureInfo.Enabled = true; } else { featureInfo.FeatureName = null; break; } } else if (property.Name == "Name") { featureInfo.FeatureName = property.Value.ToString(); } } if (string.IsNullOrEmpty(featureInfo.FeatureName)) { continue; } features.Add(featureInfo); } } return(features); }
private static WindowsFeatureInfo FromDismOutput(string output) { var result = new WindowsFeatureInfo(); foreach (var line in output .Split(StringTools.NewLineChars.ToArray(), StringSplitOptions.RemoveEmptyEntries)) { if (!line.Contains(':')) { continue; } var data = line.Substring(line.IndexOf(':') + 1).TrimStart(); if (line.StartsWith("Feature Name", StringComparison.Ordinal)) { result.FeatureName = data; } else if (line.StartsWith("State", StringComparison.Ordinal)) { result.Enabled = data.Equals("Enabled", StringComparison.InvariantCultureIgnoreCase); } else if (line.StartsWith("Display Name", StringComparison.Ordinal)) { result.DisplayName = data; } else if (line.StartsWith("Restart Required", StringComparison.Ordinal)) { result.RestartRequired = data; } else if (line.StartsWith("Description", StringComparison.Ordinal)) { result.Description = data; } } return(string.IsNullOrEmpty(result.FeatureName) ? null : result); }