Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Получить Id железа


Автор: bigturtle 27.7.2009, 11:08
Здравствуйте, скажите каким образом можно на чистом с/c++ получить Id материнки, винчестера, процессора. Спасибо. 

Автор: mes 27.7.2009, 11:12
на чистом - никак ..  для этого пользуются Api оси.


Автор: bigturtle 27.7.2009, 11:42
Тогда другие варианты, 
нашел код но это не то 
Код

#include <windows.h>
#include <stdio.h>
#define BUFSIZE 1024
int  main()
{
   LPTSTR lpszSystemInfo;      // pointer to system information string
   DWORD cchBuff = BUFSIZE;    // size of computer or user name
   TCHAR tchBuffer[BUFSIZE];   // buffer for string
   DWORD dwResult;             // function return value
 
   lpszSystemInfo = tchBuffer; 
 
   // Get and display the name of the computer.
 
   if( GetComputerName(lpszSystemInfo, &cchBuff) ) 
      printf("Computer name:  %s\n", lpszSystemInfo); 
 
   // Get and display the user name.
   cchBuff = BUFSIZE; 
   if( GetUserName(lpszSystemInfo, &cchBuff) )
      printf("User name:  %s\n\n", lpszSystemInfo);
 
   // Get and display the system directory.
 
   if( GetSystemDirectory(lpszSystemInfo, MAX_PATH+1) ) 
      printf("System directory:  %s\n", lpszSystemInfo); 
   // Get and display the Windows directory.
 
   if( GetWindowsDirectory(lpszSystemInfo, MAX_PATH+1) )
      printf("Windows directory:  %s\n\n", lpszSystemInfo);
 
   // Display the "environment variables" header.
 
   printf("Environment variables (partial list): \n"); 
 
   // Expand the OS environment variable.
 
   dwResult = ExpandEnvironmentStrings( 
                 "OS=%OS%",
                 lpszSystemInfo, 
                 BUFSIZE);
   if( dwResult <= BUFSIZE )
      printf("  %s\n", lpszSystemInfo);
 
   // Expand the PATH environment variable.
 
   dwResult = ExpandEnvironmentStrings( 
                 "PATH=%PATH%", 
                 lpszSystemInfo, 
                 BUFSIZE);
   if( dwResult <= BUFSIZE )
      printf("  %s\n", lpszSystemInfo);
 
   // Expand the TMP environment variable.
  
   dwResult = ExpandEnvironmentStrings( 
               "TEMP=%TEMP%",
               lpszSystemInfo, 
               BUFSIZE);
   if( dwResult <= BUFSIZE )
      printf("  %s\n", lpszSystemInfo);
  SYSTEM_INFO siSysInfo;
   // info about "metall" coping into structure SYSTEM_INFO.
   GetSystemInfo(&siSysInfo);
   // printing SYSTEM_INFO.
   printf("Hardware information: \n");
   printf("  OEM ID: %u\n", siSysInfo.dwOemId);
   printf("  Number of processors: %u\n",
      siSysInfo.dwNumberOfProcessors);
   printf("  Page size: %u\n", siSysInfo.dwPageSize);
   printf("  Processor type: %u\n", siSysInfo.dwProcessorType);
   printf("  Minimum application address: %lx\n",
      siSysInfo.lpMinimumApplicationAddress);
   printf("  Maximum application address: %lx\n",
      siSysInfo.lpMaximumApplicationAddress);
   printf("  Active processor mask: %u\n",
      siSysInfo.dwActiveProcessorMask);
getchar();
}

Может кому пригодится, но в мое ситуации не сильно подходит. 

Автор: azesmcar 27.7.2009, 15:31
bigturtle

Это WinAPI а не чистый C++.
А зачем нужно это сделать именно на чистом C++?

Автор: andrew_121 27.7.2009, 16:11
Ничего общего у С++ и железа нет.

Автор: bigturtle 28.7.2009, 08:27
Возможно есть у кого то код с winAPI что бы получить то что нужно... 

Автор: azesmcar 28.7.2009, 08:29
bigturtle

Id какого именно железа нужно получить? Код для всех совершенно разный, проще всего MAC адрес LAN карты.
Вот например
http://www.codeguru.com/cpp/i-n/network/networkinformation/article.php/c5451

Автор: bigturtle 28.7.2009, 09:06
Спасибо за пример,   но в моем варианте программу нужно привязать к железу и целесообразнее использовать именно id материнки или выше описанного железа.

Автор: azesmcar 28.7.2009, 09:42
Вот, изменил один пример под твои нужды, только не спрашивай меня как все это работает smile
засунь в DLL и используй на здоровье.
Код

#define _WIN32_DCOM
#include <iostream>
#include <comdef.h>
#include <Wbemidl.h>

#pragma comment(lib, "wbemuuid.lib")

int main(int argc, char **argv)
{
    CoInitialize(NULL);
    
    if(CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0) != S_OK)
        return 1;

    IWbemLocator* pIWbemLocator        = NULL;
    IWbemServices* pWbemServices        = NULL;
    IEnumWbemClassObject* pEnumObject    = NULL;

    BSTR bstrNamespace = (L"root\\cimv2");

    HRESULT hRes = CoCreateInstance(
        CLSID_WbemAdministrativeLocator,
        NULL,
        CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
        IID_IUnknown,
        (void**)&pIWbemLocator);

    if (SUCCEEDED(hRes))
    {
        hRes = pIWbemLocator->ConnectServer(bstrNamespace,
            NULL,
            NULL,
            NULL,
            0,
            NULL,
            NULL,
            &pWbemServices);
    }

    hRes = pWbemServices->ExecQuery(L"WQL", L"Select * from Win32_BaseBoard", WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject);
    ULONG uCount = 1, uReturned;
    IWbemClassObject * pClassObject = NULL;
    hRes = pEnumObject->Reset();
    hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned);
    VARIANT v;
    BSTR strClassProp = SysAllocString(L"SerialNumber");
    hRes = pClassObject->Get(strClassProp, 0, &v, 0, 0);
    SysFreeString(strClassProp);

    _bstr_t bstrPath = &v;

    char* strPath=(char*)bstrPath;
    if (SUCCEEDED(hRes))
        std::cout << strPath << std::endl;
    else
        std::cerr << "Error getting object" << std::endl;
    
    VariantClear( &v );
    pIWbemLocator->Release();
    pWbemServices->Release();
    pEnumObject->Release();
    pClassObject->Release();
    CoUninitialize();
}

Автор: bigturtle 28.7.2009, 09:47
Хотелось бы узнать как это работает (шутка) smile  Спасибо сейчас попробую...

Автор: azesmcar 28.7.2009, 09:57
Цитата(bigturtle @  28.7.2009,  09:47 Найти цитируемый пост)
Хотелось бы узнать как это работает (шутка) 

Ну..работает через WMI. В итоге Windows предоставляет эту информацию, мы просто ее берем.

Автор: jonie 28.7.2009, 23:58
Цитата
 В итоге Windows предоставляет эту информацию, мы просто ее берем.

... а значит можем и подменить...
в общем-то привязка к железу - это все до первого "кул ][@kerа" имхо...

Автор: azesmcar 29.7.2009, 06:59
Цитата(jonie @  28.7.2009,  23:58 Найти цитируемый пост)
... а значит можем и подменить...

А кто спорит то, подменить можно все, но кому это надо? В конце концов легче программе дизассемблером изменить условие проверки чем подменять ID материнской платы. Но это отдельный разговор. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)