Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2011, 18:31   #1
Tip.the.besT
------------------
Пользователь
 
Регистрация: 15.08.2011
Сообщений: 78
Печаль Серийные номера устройств.

Доброго времени суток.

Вообщем столкнулся с необходимостью определять физические серийные номера устройств, таких как: винчестер, сетевая плата(если не встроеная), процессор, CD/DVD-привод, материнка, память, видеокарта(опять же если не встроеная). О винчестерах много написано, но как быть с остальными устройствами? Линки по материалам приветствуются.
был бы один системник я бы и так нашёл, но их много
C YBA}|{EH|/|EM Tip.the.besT
Tip.the.besT вне форума Ответить с цитированием
Старый 21.09.2011, 19:55   #2
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Копать в сторону WMI, что-то типа

Код:
program WmiTest;

{$APPTYPE CONSOLE}

uses
  SysUtils, ActiveX, ComObj, Variants;

function GetWMIstring(wmiHost, root, wmiClass, wmiProperty: string): string;
var
  objWMIService : OLEVariant;
  colItems      : OLEVariant;
  colItem       : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;

  function GetWMIObject(const objectName: String): IDispatch;
  var
    chEaten: Integer;
    BindCtx: IBindCtx;
    Moniker: IMoniker;
  begin
    OleCheck(CreateBindCtx(0, bindCtx));
    OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));
    OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
  end;

begin
  objWMIService := GetWMIObject(Format('winmgmts:\\%s\%s',[wmiHost,root]));
  colItems      := objWMIService.ExecQuery(Format('SELECT * FROM %s',[wmiClass]),'WQL',0);
  oEnum         := IUnknown(colItems._NewEnum) as IEnumVariant;
  while oEnum.Next(1, colItem, iValue) = 0 do
  begin
     if VarIsNull(colItem.Properties_.Item(wmiProperty, 0)) then Result := 'NULL'
     else Result := colItem.Properties_.Item(wmiProperty, 0)
  end;
end;

begin
 try
    CoInitialize(nil);
    try
      WriteLn(GetWMIstring('.', 'root\CIMV2', 'Win32_BaseBoard','SerialNumber'));
      WriteLn(GetWMIstring('.', 'root\CIMV2', 'Win32_BaseBoard','Product'));
      WriteLn(GetWMIstring('.', 'root\CIMV2', 'Win32_OperatingSystem','SerialNumber'));
      Readln;
    finally
      CoUninitialize;
    end;
 except
    on E:Exception do
    Begin
        Writeln(E.Classname, ': ', E.Message);
        Readln;
    End;
  end;
end.
пыщь
JTG вне форума Ответить с цитированием
Старый 21.09.2011, 19:58   #3
Tip.the.besT
------------------
Пользователь
 
Регистрация: 15.08.2011
Сообщений: 78
По умолчанию

JTG конечно извините за наглость, но немогли бы закоментировать?
C YBA}|{EH|/|EM Tip.the.besT
Tip.the.besT вне форума Ответить с цитированием
Старый 22.09.2011, 00:39   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Да это такая лапша, что даже разработчики в Microsoft её не понимают Короче, WMI представляет собой набор зарегистрированных в системе СОМ-серверов (т.е. по сути библиотек), реализующих классы для доступа к разной информации и предоставляющих интерфейс для работы с ней.

Доступ к нужному классу осуществляется с помощью WMI-моникера, строки вида
Цитата:
winmgmts:{параметры_безопасности}!\ \имя_компьютера\пространство_имён:к ласс
BindToObject для этого моникера возвращает объект SWbemServices. У SWbemServices есть метод ExecQuery, который использует SQL-подобный язык запросов, в данном случае
Цитата:
SELECT * FROM имя_класса
возвращающий коллекцию SWbemObjectSet, например для Win32_BaseBoard результатом будет такая штука
Цитата:
Caption=Основная плата
ConfigOptions=
CreationClassName=Win32_BaseBoard
Depth=
Description=Основная плата
Height=
HostingBoard=TRUE
HotSwappable=
InstallDate=
Manufacturer=Winfast
Model=
Name=Основная плата
OtherIdentifyingInfo=
PartNumber=
PoweredOn=TRUE
Product=NF4(X)K8MC
Removable=
Replaceable=
RequirementsDescription=
RequiresDaughterBoard=
SerialNumber=
SKU=
SlotLayout=
SpecialRequirements=
Status=
Tag=Base Board
Version=
Weight=
Width=
из которой выбирается нужное свойство.

Весь этот ужас тут завёрнут в ф-ю GetWMIstring('компьютер', 'пространство_имён', 'класс', 'свойство'), код, кстати, из гугла, могут быть ошибки.

Список классов root\CIMV2 http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx
пыщь

Последний раз редактировалось JTG; 22.09.2011 в 00:42.
JTG вне форума Ответить с цитированием
Старый 22.09.2011, 06:16   #5
Tip.the.besT
------------------
Пользователь
 
Регистрация: 15.08.2011
Сообщений: 78
Смех

Вообщем понятно, закомплимитировал в delphi 7 консольное приложение, работает, сейчас только подберу нужные классы и должно быть всё хорошо, после чего выложу код, может кому пригодится, а то смотрю ни кто и не знает даже об этом

JTG конечно отдельное спасибо, помог Разработчики Windows помойму половину того что пишут потом не понимают Такое ощющение, что Гейтс стоит у них за спиной и бьёт их палкой когда они медленно работают
C YBA}|{EH|/|EM Tip.the.besT

Последний раз редактировалось Tip.the.besT; 22.09.2011 в 19:10.
Tip.the.besT вне форума Ответить с цитированием
Старый 05.10.2011, 19:54   #6
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

Цитата:
Сообщение от Tip.the.besT Посмотреть сообщение
Вообщем столкнулся с необходимостью определять физические серийные номера устройств, таких как: винчестер, сетевая плата(если не встроеная), процессор, CD/DVD-привод, материнка, память, видеокарта(опять же если не встроеная).
не у всех устройств есть серийные номера. у одной модели материнки может быть уникальный ID, а у другой быть что-то в духе "ID-1234567890" или "1111111-AAAA". если нужна именно инфа об устройствах, то копать в сторону SetupAPI. если нужна привязка к аппаратуре, я находила на этом в форуме (месяца три назад) и в этом разделе тему с подобной тематикой про флешки.
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Детектирование устройств. Devourer12345 Помощь студентам 5 12.04.2010 23:21
система: список устройств Defo45 Общие вопросы C/C++ 0 16.12.2009 22:34
Система координат устройств AJlxuMuk Win Api 1 08.10.2009 22:19
Список устройств CraZZy RabbIt Win Api 5 10.03.2009 13:15
Номера прерываний... Устройств... в паскале )Игнат( Паскаль, Turbo Pascal, PascalABC.NET 0 17.12.2008 19:34