Используем C#, чтобы узнать, из чего сделан ваш компьютер
Что вы знаете о своем компьютере, о том, перед монитором которого в данный момент сидите?
Вы, наверно, знаете, кто его изготовил, сколько в нем жестких дисков, какова его скорость работы. Если вы немного более подкованы в техническом плане, то, возможно, знаете еще тип процессора или количество USB портов – и в большинстве случаев это будет вся информация.
Возможно, вы будете удивлены, но помимо основных технических характеристик, можно узнать о своей машине много нового и интересного.
.NET framework располагает такими классами и пространствами имен, которые могут найти и выдать немало удивительной информации о вашем компьютере. Её объем может буквально ошеломить; есть возможность выяснить даже такие подробности как патчи и исправления BIOS компьютера от производителя.
В этой статье мы рассмотрим некоторые возможности получения информации о компьютере; с помощью C# научимся выводить данные в консоль и в текстовый файл.
Во-первых, основы
Есть два основных инструмента, с помощью которых можно извлечь информацию из любой версии Windows: System.Environment и System.Management.
Из двух этих system.environment проще в использовании; это просто набор неизменяемых переменных, которые выдают информацию о версии операционной системы, числе процессоров, количестве жестких дисков и имени компьютера. Узнать данную информацию можно в любое время.
А вот system.management, с другой стороны, хотя тоже не так уж и сложен в использовании, требует обработки полученных данных, чтобы добраться до каких-нибудь конкретных деталей. Однако, system.management отличается тем, что может выдать больший объем информации о компьютере.
Во-первых, однако, давайте рассмотрим system.environment. Запустите Visual Studio и создайте консольное приложение (проект приложения для командной строки). Код:
using System; using System.Management; namespace YourComputer { class Program { static void Main(string[] args) { Console.WriteLine(Environment.OSVersion); Console.ReadKey(); } } }В то время как вы печатаете, вы можете видеть IntelliSense - показывает различные статические свойства, доступные в классе он окружения:
Рисунок 1: IntelliSense пытается помочь
Строка номер 12 требуется для того, чтобы вы могли посмотреть на информацию, прежде чем консоль закроется. Закрыть её можно нажатием любой клавиши. Если вы просто запустите консольное приложение, то вы увидите, что оно в консоли отображает текущую версию ОС Windows:
Рисунок 2: Отображение версии Windows
Давайте немного перестроим наш код и научим наше приложение отображать больше информации:
using System; using System.Management; namespace YourComputer { class Program { static void Main(string[] args) { Console.WriteLine("Версия Windows: {0}", Environment.OSVersion); Console.WriteLine("64 Bit операционная система? : {0}", Environment.Is64BitOperatingSystem ? "Да" : "Нет"); Console.WriteLine("Имя компьютера : {0}", Environment.MachineName); Console.WriteLine("Число процессоров : {0}", Environment.ProcessorCount); Console.WriteLine("Системная папка : {0}", Environment.SystemDirectory); Console.WriteLine("Логические диски : {0}", String.Join(", ", Environment.GetLogicalDrives()) .TrimEnd(',', ' ') .Replace("\\", String.Empty)); Console.ReadKey(); } } }Если сейчас запустить приложение снова, то вы увидите, что там выводится гораздо больше информации, чем было раньше:
Рисунок 3: Там гораздо больше информации в настоящее время
Давайте добавим еще код в нашу программу: во-первых, класс провести нашу информацию, называемую "BasicInfo.cs", следующим образом:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace YourComputer { public class BasicInfo { public string OsVersion { get; set; } public bool Os64 { get; set; } public string PcName { get; set; } public int NumberOfCpus { get; set; } public string WindowsFolder { get; set; } public string[] LogicalDrives { get; set; } public override string ToString() { StringBuilder output = new StringBuilder(); output.AppendFormat("Версия Windows: {0}\n", OsVersion); output.AppendFormat("64 Bit операционная система? : {0}\n", Os64 ? "Yes" : "No"); output.AppendFormat("Имя компьютера: {0}\n", PcName); output.AppendFormat("Число процессоров: {0}\n", NumberOfCpus); output.AppendFormat("Системная папка : {0}\n", WindowsFolder); output.AppendFormat("Логические диски : {0}\n", String.Join(", ", LogicalDrives) .Replace("\\", String.Empty)); return output.ToString(); } } }Не забудьте изменить пространство имен (namespace YourComputer), чтобы оно соответствовало вашему проекту. Отметим также, что мы добавили перегруженный метод «ToString», чтобы получить наш объект в виде строки. Вы поймете зачем через минуту. С помощью этого класса, теперь давайте заполнять его значениями, какими хотим, а не показывать их:
using System; using System.Management; namespace YourComputer { class Program { static void Main(string[] args) { BasicInfo myInfo = new BasicInfo { OsVersion = Environment.OSVersion.ToString(), Os64 = Environment.Is64BitOperatingSystem, PcName = Environment.MachineName, NumberOfCpus = Environment.ProcessorCount, WindowsFolder = Environment.SystemDirectory, LogicalDrives = Environment.GetLogicalDrives() }; Console.WriteLine(myInfo); Console.ReadKey(); } } }Этот код выведет на дисплей ту же информацию, какую мы увидели на рисунке ранее. Теперь с помощью менеджера пакетов NuGet установите в проекте Newtonsoft.Json. Затем измените эту строку:
Console.WriteLine(myInfo);в вашей программе на этот кусок кода:
string json = JsonConvert.SerializeObject(myInfo, Formatting.Indented); Console.WriteLine(json);и если все работает, вы должны получить вывод, который отформатирован на выходе подходящей форме для отправки на веб-страницу: Json данных готов для показа.
Зачем это нужно? Ну, теперь у вас есть небольшая программа, которая может быть использована для создания файла JSON с системной информации на веб-сайте. Теперь вы сможете создать файл в формате JSON или другой веб-технологии, чтобы загрузить и отобразить в веб-страницы.
Теперь теоретически вы можете самостоятельно создавать другие вызовы, чтобы читать информацию дальше: прямо в вашем веб-приложении с использованием кода C#. System.Environment отлично подходит для простых, небольших и быстрых приложений, однако в некоторых случаях и System.Management будет выдавать информацию на 5, 10 или 15 секунд быстрее.
Для того, чтобы не было задержки в режиме реального времени, чтобы не задерживать с отзывом веб-приложение, лучшим подходом будет использование небольшой консольной программы. Эта программа будет запускаться, скажем, раз в 12 часов и генерировать json-файл для дальнейшего использования.
Быстрый взгляд на System.Management
Возможности system.management поистине огромны; даже удивительно, если вы раньше не знали о том, как можно использовать это пространство имен. Доступ к нему несложен. Существует 430 вариантов обращения за необходимой информацией. К примеру, если вам требуется узнать, каковы возможности вашего процессора, то необходимо извлечь информацию из
Win32_Processor
Информация о классе.
Вы получаете доступ к информации путем создания объекта ManagementClass следующим образом:
ManagementClass myManagementClass = new ManagementClass("Win32_Processor");а затем доступ к свойствам для данного класса:
ManagementObjectCollection myManagementCollection = myManagementClass.GetInstances (); PropertyDataCollection myProperties = myManagementClass.Properties;Которые затем можно перебрать, используя два вложенных друг в друга цикла:
foreach (ManagementObject obj in myManagemenCollection) { foreach (PropertyData property in myProperties) { // Доступ к вашим свойствам здесь, используя 'property' } }Переменная “property“ во внутреннем цикле будет содержать имя ключа и тип значения. Можно создавать собственные классы обертки, но здесь я просто демонстрирую базовые возможности.
Объединяя все это вместе, мы получаем следующий код, выдающий основную информацию о нашем процессоре:
using System; using System.Management; using System.Collections.Generic; namespace YourComputer { class Program { static void Main(string[] args) { ManagementClass myManagementClass = new ManagementClass("Win32_Processor"); ManagementObjectCollection myManagementCollection = myManagementClass.GetInstances(); PropertyDataCollection myProperties = myManagementClass.Properties; DictionaryКоторый, при запуске на моей машине, дает мне:myPropertyResults = new Dictionary (); foreach (var obj in myManagementCollection) { foreach (var myProperty in myProperties) { myPropertyResults.Add(myProperty.Name, obj.Properties[myProperty.Name].Value); } } foreach (var myPropertyResult in myPropertyResults) { Console.WriteLine("{0}: {1}", myPropertyResult.Key, myPropertyResult.Value); } Console.ReadKey(); } } }
Рисунок 4: больше информации о компьютере
Я не собираюсь повторять полный список известных классов в этой статье. Вместо этого, вы можете найти их все на MSDN здесь:
https://msdn.microsoft.com/en-us/library/aa389273(v=vs.85).aspx
Автор Петер Шоу, текст переведен Юрием Пахолковым. Перевод статьи несколько вольный, в некоторых случаях код заменен на мой; также заменены некоторые картинки. Все примеры были проверены на Microsoft Visual C# 2010 Express. Если вам требуется качественный перевод с английского языка (включая специфические тексты по ИТ-тематике), то вы можете обратиться к нам: пишите на электронную почту up777up@yandex.ru с темой "перевод". Мы с удовольствием и за очень небольшую сумму в отечественной или иностранной валюте вам поможем.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Читайте также:
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.