[C#] Сбор информации о компьютере [1]

Программирование
В случае, когда в вашей сети несколько сотен компьютеров, их учет стоит довольно остро. Перепробовав немало различных программ по учету программ, лицензий и железа пришел к выводу, необходимо написать собственное решение, отвечающее нашим запросам. Первым этапом разработки будет написание сборщика информации с компьютеров на языке C# в IDE SharpDeveloper. Пока я копался в интернете с вопросом как же можно из системы получить информацию о ней, то пришел к выводу, что информации на эту тему довольно мало, что было неожиданно. В основном натыкался на скрипты на VB и просьбы других программистов перевести их на C#, а в MSDN и вовсе довольно скудная информация. Я надеюсь, собранные здесь исходники кому-то помогут в написании программы.

Собирать информацию я буду с помощью инструмента WMI. WMI является очень мощным инструментом и может предоставлять информацию о системе, причем неважно локальной или удаленной. WMI запросы, как правило, открыты в сети, если у вас есть привилегии необходимые для запроса. И хотя в WMI удаленные запросы просты, разработчикам они нравятся и по другой причине: WQL.
WQL позволяет составлять запросы WMI с использованием SQL-подобного языка запросов. Если вы знаете названия доступных полей, то можете получить информацию очень легко. Например, если вы хотите получить список логических дисков из системы можно использовать следующий запрос:
Select * from Win32_LogicalDisk

Можно, однако, уточнить поиск с помощью конкретных «полей» в запросе. Следующий запрос вернет свободное место, размер и имя всех фиксированных дисков:
Select FreeSpace,Size,Name from Win32_LogicalDisk where DriveType=3

Как видите, построение простых запросов WMI очень простое, очень похоже на запросы к базы данных.
Следующий довольно простой код выведет список всех активных процессов в системе:
using System;
using System.Management;

namespace test
{
class Program
{
public static void Main(string[] args)
{
	ManagementObjectSearcher searcher = 
        new ManagementObjectSearcher("root\\CIMV2", 
           "Select Name, CommandLine From Win32_Process");
 
	foreach (ManagementObject instance in searcher.Get())
	{
	   Console.WriteLine("{0}", instance["Name"]);
	}
	Console.Write("Press any key to continue . . . ");
	Console.ReadKey(true);
}
}
}

Код для вывода списка установленного программного обеспечения, с датой установки:
using System;
using System.Management;

namespace test
{
class Program
{
public static void Main(string[] args)
{
 	ManagementObjectSearcher searcher_soft = 
        new ManagementObjectSearcher("root\\CIMV2", 
           "SELECT * FROM Win32_Product"); 

        foreach (ManagementObject queryObj in searcher_soft.Get())
        {
            Console.WriteLine("<soft> Caption: {0} ; InstallDate: {1}</soft>", 
                              queryObj["Caption"], queryObj["InstallDate"]);
        }

	Console.Write("Press any key to continue . . . ");
	Console.ReadKey(true);
}
}
}

Код для вывода информации о службах их описании и состоянии:
using System;
using System.Management;

namespace test
{
class Program
{
public static void Main(string[] args)
{
        ManagementObjectSearcher searcher3 = 
        new ManagementObjectSearcher("root\\CIMV2", 
            "SELECT * FROM Win32_Service"); 

        foreach (ManagementObject queryObj in searcher3.Get())
        {
            Console.WriteLine("-----------------------------------");
            Console.WriteLine("Win32_Service instance");
            Console.WriteLine("-----------------------------------");
            Console.WriteLine("Caption: {0}", queryObj["Caption"]);
            Console.WriteLine("Description: {0}", queryObj["Description"]);
            Console.WriteLine("DisplayName: {0}", queryObj["DisplayName"]);
            Console.WriteLine("Name: {0}", queryObj["Name"]);
            Console.WriteLine("PathName: {0}", queryObj["PathName"]);
            Console.WriteLine("Started: {0}", queryObj["Started"]);
        }

	Console.Write("Press any key to continue . . . ");
	Console.ReadKey(true);
}
}
}

Код вывода большого количества разной информации о операционной системе, в том числе ее версию, номер сервиспака, количества свободной памяти и многое другое:
using System;
using System.Management;

namespace test
{
class Program
{
public static void Main(string[] args)
{
	ManagementObjectSearcher searcher5 = 
        new ManagementObjectSearcher("root\\CIMV2", 
            "SELECT * FROM Win32_OperatingSystem"); 

        foreach (ManagementObject queryObj in searcher5.Get())
        {
            Console.WriteLine("-----------------------------------");
            Console.WriteLine("Win32_OperatingSystem instance");
            Console.WriteLine("-----------------------------------");
            Console.WriteLine("BuildNumber: {0}", queryObj["BuildNumber"]);
            Console.WriteLine("Caption: {0}", queryObj["Caption"]);
            Console.WriteLine("FreePhysicalMemory: {0}", queryObj["FreePhysicalMemory"]);
            Console.WriteLine("FreeVirtualMemory: {0}", queryObj["FreeVirtualMemory"]);
            Console.WriteLine("Name: {0}", queryObj["Name"]);
            Console.WriteLine("OSType: {0}", queryObj["OSType"]);
            Console.WriteLine("RegisteredUser: {0}", queryObj["RegisteredUser"]);
            Console.WriteLine("SerialNumber: {0}", queryObj["SerialNumber"]);
            Console.WriteLine("ServicePackMajorVersion: {0}", queryObj["ServicePackMajorVersion"]);
            Console.WriteLine("ServicePackMinorVersion: {0}", queryObj["ServicePackMinorVersion"]);
            Console.WriteLine("Status: {0}", queryObj["Status"]);
            Console.WriteLine("SystemDevice: {0}", queryObj["SystemDevice"]);
            Console.WriteLine("SystemDirectory: {0}", queryObj["SystemDirectory"]);
            Console.WriteLine("SystemDrive: {0}", queryObj["SystemDrive"]);
            Console.WriteLine("Version: {0}", queryObj["Version"]);
            Console.WriteLine("WindowsDirectory: {0}", queryObj["WindowsDirectory"]);
        }

	Console.Write("Press any key to continue . . . ");
	Console.ReadKey(true);
}
}
}

Ну и напоследок, код вывода всех дисков системы, их название, тип файловой системы, свободное место и тип диска:
using System;
using System.Management;

namespace test
{
class Program
{
public static void Main(string[] args)
{
        ManagementObjectSearcher searcher = 
            new ManagementObjectSearcher("root\\CIMV2", 
            "SELECT * FROM Win32_Volume"); 

        foreach (ManagementObject queryObj in searcher.Get())
        {
            Console.WriteLine("-----------------------------------");
            Console.WriteLine("Win32_Volume instance");
            Console.WriteLine("-----------------------------------");
            Console.WriteLine("Capacity: {0}", queryObj["Capacity"]);
            Console.WriteLine("Caption: {0}", queryObj["Caption"]);
            Console.WriteLine("DriveLetter: {0}", queryObj["DriveLetter"]);
            Console.WriteLine("DriveType: {0}", queryObj["DriveType"]);
            Console.WriteLine("FileSystem: {0}", queryObj["FileSystem"]);
            Console.WriteLine("FreeSpace: {0}", queryObj["FreeSpace"]);
        }

	Console.Write("Press any key to continue . . . ");
	Console.ReadKey(true);
}
}
}


В следующей части соберу информацию о железе и добавлю запросы по сети.

Так же рекомендую:
[C#] Сбор информации о компьютере [2]

1 комментарий

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.