示例#1
0
        /// <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);
        }