1 / 1 / 1
Регистрация: 04.12.2009
Сообщений: 6
1

Настоящий серийный номер жесткого диска

14.12.2009, 18:42. Показов 7241. Ответов 1
Метки нет (Все метки)

Среда Borland Builder C++
Нужно было сделать WMI запрос.
ну как обычно мелкомягкие сделали библиотеку wbemuuid.lib только под себя.
копался я конечно ОЧЕНЬ долго пока каким то чудом не наткнулся на сайт китайского задрота Билдыра
http://www.cppfans.com/articles/system/bcb_wmi.asp
а также кому интересно качайте этот архив:
http://www.cppfans.com/cntfile.asp?fn=wmi_bcb
этот китаец вручную написал и скомпилировал данную библиотеку а так же создал простую ф-ю для извлечения информации из соответствующей таблицы.
при выполнении WMI запроса нам возвращается список ассоциативных массивов.
когда я это понял руки прямо зачесались перевести это дело в более удобный формат представления данных:
(hash_map не поддерживается поэтому пришлось сделать просто map)
вот пользуйтесь каму нада:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
void GetWmiInfo(list<map<String,String> > &lpList, WideString wsClass)
{
  IWbemLocator *pWbemLocator = NULL;
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
   {
     IWbemServices *pWbemServices = NULL;
     WideString wsNamespace = (L"root\\cimv2");
     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
      {
        IEnumWbemClassObject *pEnumClassObject = NULL;
        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
         {
           IWbemClassObject *pClassObject = NULL;
           ULONG uCount = 1, uReturned;
           if(pEnumClassObject->Reset() == S_OK)
            {
              int iEnumIdx = 0;
              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
               {
                 SAFEARRAY *pvNames = NULL;
                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
                  {
                    long vbl, vbu;
                    SafeArrayGetLBound(pvNames, 1, &vbl);
                    SafeArrayGetUBound(pvNames, 1, &vbu);
                    map<String,String> temp;
                    for(long idx=vbl; idx<=vbu; idx++)
                     {
                       long aidx = idx;
                       wchar_t *wsName = 0;
                       VARIANT vValue;
                       VariantInit(&vValue);
                       SafeArrayGetElement(pvNames, &aidx, &wsName);
 
                       BSTR bs = SysAllocString(wsName);
                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
                       SysFreeString(bs);
 
                       if(hRes == S_OK)
                        {
                          AnsiString s;
                          Variant v = *(Variant*)&vValue;
                          if(v.IsArray())
                           {
                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
                              {
                                Variant a = v.GetElement(i);
                                if(!s.IsEmpty())
                                  s+=", ";
                                s+=VarToStr(a);
                              }
                           }
                          else
                           {
                             s = VarToStr(v);
                           }
                          temp.insert(pair<String,String>(AnsiString(wsName),s));
                        }
 
                       VariantClear(&vValue);
                       SysFreeString(wsName);
                     }
                     lpList.push_back(temp);
                  }
                 if(pvNames)SafeArrayDestroy(pvNames);
                 iEnumIdx++;
               }
            }
           if(pClassObject)pClassObject->Release();
         }
        if(pEnumClassObject)pEnumClassObject->Release();
      }
     if(pWbemServices)pWbemServices->Release();
   }
  if(pWbemLocator)pWbemLocator->Release();
}
Ну так вот: беру я и пишу:
C++
1
GetWmiInfo(this->HDD_list,"Win32_DiskDrive");
у меня на машине 2 веника стационарных и флешка еще воткнута была.
он мне нашел список из 3 элементов.
ну я взял и выковырял из этих списков только те "PNPDeviceID" когда "InterfaceType" == "IDE"
получил я 2 номера своих жестких дисков и радостный продолжил делать свою задачку.
...
прихожу в универ и думаю дай задачу сдам.
а тут опачки!!!!
винду то в универе ставят как:
поставят винду на 1 комп а затем хитрым каким то "акронисом" копируют это дело на все машины!
вышло так что я получил ОДИНАКОВЫЕ номера жестких дисков для всех машин!
задачу в итоге не сдал!

Так откуда же все таки читать НАСТОЯЩИЕ номера жестких дисков?
из какой таблицы базы "root\\cimv2"???
или это вообще невозможно???
*в силу того что при вышеуказанном способе "установки" винды копируется реестр
*а значит паходу ничего НЕ виртуально не почитаеш?!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.12.2009, 18:42
Ответы с готовыми решениями:

Пример из книги Архангельского - извлечь серийный номер диска
Всем добро друзья! :friends: По книге Архангельского пробую извлеч серийный номер диска индекс...

Какой апи функцией можно получить номер жесткого диска (не тома)
То есть хотелось бы вытащить из жесткого диска его биос-номер но не номер тома

Изменить серийный номер, номер прошивки и название жесткого диска
Всем привет. Для начало суть проблемы. Есть софт, который прикреплен к одному железу. После...

Как узнать серийный номер жёсткого диска?
Здравствуйте, подскажите, буду очень признателен. Пытаюсь поставить прогу, а чтобы крякнуть её надо...

1
61 / 62 / 3
Регистрация: 25.05.2009
Сообщений: 520
15.12.2009, 14:38 2
ИМХО, тут ассемблером надо воркать.
Покопайся с прерываниями int 41h и int 13h
И не забудь поделиться результатом
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.12.2009, 14:38
Помогаю со студенческими работами здесь

Серийный номер жесткого диска php mysql
здравствуйте я тут скрипт написал про регистрацию пользователей и в БД записывается IP adress...

Узнать серийный номер жесткого диска, используя WinAPI
Например, хочу узнать серийный номер жесткого диска, используя WinAPI. Нашел функцию...

Привязка к параметрам. Как узнать серийный номер раздела жёсткого диска?
Как узнать серийный номер раздела жёсткого диска?

Как узнать серийный номер раздела жёсткого диска через cmd?
Как узнать серийный номер раздела жёсткого диска через cmd?

Как сделать так, чтобы программа работала с параметром серийный номер раздела жёсткого диска?
Как сделать так, чтобы программа работала с параметром серийный номер раздела жёсткого диска?

Серийный номер процессора или жесткого диска или материнки
Парни, помогите пожалуйста, очень нужен пример на delphi 7 как считать серийный номер ПРОЦЕССОРА...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru