Show / Hide Table of Contents

MSDN.WhiteKnight - Stack Overflow answers

Ответ на "C# Как достать информацию об устройствах компьютера не используя WMI"

Answer 780170

Link

На самом деле, некоторую информацию можно получить без всякого P/Invoke.

Класс Environment:

Console.WriteLine("OS version: " + Environment.OSVersion.ToString());
Console.WriteLine("Processor count: " + Environment.ProcessorCount.ToString());

Ветка реестра HKLM\Hardware:

using Microsoft.Win32;

//...

object result = Registry.GetValue(
"HKEY_LOCAL_MACHINE\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 
"ProcessorNameString",  "");

if (result != null) Console.WriteLine("Processor name: " + (result).ToString());

result = Registry.GetValue(
"HKEY_LOCAL_MACHINE\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",
"~MHz", 0);

if (result != null) 
{
    Console.WriteLine("Processor frequency: " + ((int)result).ToString()+" MHz");
}

result = Registry.GetValue(
"HKEY_LOCAL_MACHINE\\HARDWARE\\DESCRIPTION\\System\\BIOS"
, "BaseBoardManufacturer", "");

if (result != null) Console.WriteLine("Motherboard vendor: " + (result).ToString());

result = Registry.GetValue(
"HKEY_LOCAL_MACHINE\\HARDWARE\\DESCRIPTION\\System\\BIOS"
, "BaseBoardProduct", 0);

if (result != null) Console.WriteLine("Motherboard name: " + (result).ToString());

Но основная часть информации об устройствах находится в таблице SMBIOS, которую можно получить функцией GetSystemFirmwareTable (действительно, из kernel32.dll):

[DllImport("kernel32.dll")]
public static extern uint GetSystemFirmwareTable(
    uint FirmwareTableProviderSignature,
    uint FirmwareTableID,
    [Out, MarshalAs(UnmanagedType.LPArray)] byte[] pFirmwareTableBuffer,
    uint BufferSize);

// ...

byte[] arr = new byte[5000];                
uint sig = 0x52534D42;//RSMB

uint res = GetSystemFirmwareTable(sig, 0, arr, 5000);
if (res == 0 || res > 5000) 
{
      throw new ApplicationException("GetSystemFirmwareTable failed");
}    

Структура таблицы SMBIOS описана в спецификации: https://www.dmtf.org/standards/smbios

Пример извлечения сведений об оборудовании на языке C можно найти здесь. Также, здесь есть код парсера SMBIOS на C#, под лицензией MPL.


Content is retrieved from StackExchange API.

Auto-generated by ruso-archive tools.

Back to top Stack Overflow answers (published from sources in GitHub repository). Copyright (c) 2020, MSDN.WhiteKnight. Content licensed under BSD 3-Clause License.
Generated by DocFX