[펌]API 클라이언트 정보 예제들…

출처 : http://linkc.tistory.com/entry/System-Information-%EC%9D%84-%EA%B0%80%EC%A0%B8%EC%98%A4%EB%8A%94-API

1. Computer Name 가져오기
–  GetComputerName 











  1. CString SerialPort::Get_Sys_Info()  

  2. {  

  3.  

  4.     TCHAR szComName[100];  

  5.     DWORD len=100;  

  6.          

  7.     if ( GetComputerName(szComName,&len) ) 

  8.     { 

  9.         return szComName;  

  10.     } 

  11.     else 

  12.     { 

  13.         return “Fail to Load the Computer Name “;  

  14.     } 

  15. }  






2. CPU Information 가져오기
 – GetSystemInfo







다만 이 함수는 구체적인 정보를 얻을 수 없더군요

그래서 다른 방법을 찾아봤고 Registry를 이용하는 방법을 찾아냈습니다



– RegOpenKeyEx  -> RegQueryValueEX





















  1. CString Get_Cpu_Info()  

  2. {  

  3.      

  4.  

  5.     TCHAR Cpu_info[100];  

  6.      

  7.     HKEY hKey;  

  8.     HKEY hk_1;  

  9.     int i = 0;  

  10.  

  11.     long result=0;  

  12.          

  13.     DWORD c_size = sizeof(Cpu_info);  

  14.      

  15.     RegOpenKeyEx(HKEY_LOCAL_MACHINE,“Hardware\Description\System\CentralProcessor\0”,0,KEY_QUERY_VALUE,&hKey);  

  16.                          

  17.     RegQueryValueEx (hKey, “ProcessorNameString”, NULL, NULL, (LPBYTE) Cpu_info   ,    &c_size);  

  18.  

  19.     RegCloseKey (hKey);  

  20.  

  21.     return Cpu_info;  

  22. }  




3. OS Information


          GetVersionEx 






OS 같은 경우도 좀 까다로운데 ..

각 버전마다 일치하는 OS를 지정해줘야합니다

일단 MS 에서 예제로 제공한 코드입니다

상당히 자세한 정보를 얻을 수 있지만 

하위 Windows 에서는 안돌아가는 걸로 확인했습니다

제가 7을 쓰고 있는데 7은 정상작동합니다 😀




  1. #include <windows.h> 

  2. #include <tchar.h> 

  3. #include <stdio.h> 

  4. #include <strsafe.h> 

  5.  

  6. #pragma comment(lib, “User32.lib”) 

  7.  

  8. #define BUFSIZE 256 

  9.  

  10. typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);  

  11. typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);  

  12.  

  13. BOOL GetOSDisplayString( LPTSTR pszOS)  

  14. {  

  15.    OSVERSIONINFOEX osvi;  

  16.    SYSTEM_INFO si;  

  17.    PGNSI pGNSI;  

  18.    PGPI pGPI;  

  19.    BOOL bOsVersionInfoEx;  

  20.    DWORD dwType;  

  21.  

  22.    ZeroMemory(&si, sizeof(SYSTEM_INFO));  

  23.    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));  

  24.  

  25.    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);  

  26.  

  27.    if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) ) 

  28.       return 1;  

  29.  

  30.    // Call GetNativeSystemInfo if supported or GetSystemInfo otherwise. 

  31.  

  32.    pGNSI = (PGNSI) GetProcAddress(  

  33.       GetModuleHandle(TEXT(“kernel32.dll”)),  

  34.       “GetNativeSystemInfo”);  

  35.    if(NULL != pGNSI)  

  36.       pGNSI(&si);  

  37.    else GetSystemInfo(&si);  

  38.  

  39.    if ( VER_PLATFORM_WIN32_NT==osvi.dwPlatformId &&  

  40.         osvi.dwMajorVersion > 4 )  

  41.    {  

  42.       StringCchCopy(pszOS, BUFSIZE, TEXT(“Microsoft “));  

  43.  

  44.       // Test for the specific product. 

  45.  

  46.       if ( osvi.dwMajorVersion == 6 )  

  47.       { 

  48.          if( osvi.dwMinorVersion == 0 )  

  49.          {  

  50.             if( osvi.wProductType == VER_NT_WORKSTATION ) 

  51.                 StringCchCat(pszOS, BUFSIZE, TEXT(“Windows Vista “));  

  52.             else StringCchCat(pszOS, BUFSIZE, TEXT(“Windows Server 2008 “ ));  

  53.          }  

  54.  

  55.          if ( osvi.dwMinorVersion == 1 )  

  56.          {  

  57.             if( osvi.wProductType == VER_NT_WORKSTATION ) 

  58.                 StringCchCat(pszOS, BUFSIZE, TEXT(“Windows 7 “));  

  59.             else StringCchCat(pszOS, BUFSIZE, TEXT(“Windows Server 2008 R2 “ ));  

  60.          }  

  61.            

  62.          pGPI = (PGPI) GetProcAddress(  

  63.             GetModuleHandle(TEXT(“kernel32.dll”)),  

  64.             “GetProductInfo”);  

  65.  

  66.          pGPI( osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType);  

  67.  

  68.          switch( dwType ) 

  69.          {  

  70.             case PRODUCT_ULTIMATE:  

  71.                StringCchCat(pszOS, BUFSIZE, TEXT(“Ultimate Edition” ));  

  72.                break;  

  73.             case PRODUCT_PROFESSIONAL:  

  74.                StringCchCat(pszOS, BUFSIZE, TEXT(“Professional” ));  

  75.                break;  

  76.             case PRODUCT_HOME_PREMIUM:  

  77.                StringCchCat(pszOS, BUFSIZE, TEXT(“Home Premium Edition” ));  

  78.                break;  

  79.             case PRODUCT_HOME_BASIC:  

  80.                StringCchCat(pszOS, BUFSIZE, TEXT(“Home Basic Edition” ));  

  81.                break;  

  82.             case PRODUCT_ENTERPRISE:  

  83.                StringCchCat(pszOS, BUFSIZE, TEXT(“Enterprise Edition” ));  

  84.                break;  

  85.             case PRODUCT_BUSINESS:  

  86.                StringCchCat(pszOS, BUFSIZE, TEXT(“Business Edition” ));  

  87.                break;  

  88.             case PRODUCT_STARTER:  

  89.                StringCchCat(pszOS, BUFSIZE, TEXT(“Starter Edition” ));  

  90.                break;  

  91.             case PRODUCT_CLUSTER_SERVER:  

  92.                StringCchCat(pszOS, BUFSIZE, TEXT(“Cluster Server Edition” ));  

  93.                break;  

  94.             case PRODUCT_DATACENTER_SERVER:  

  95.                StringCchCat(pszOS, BUFSIZE, TEXT(“Datacenter Edition” ));  

  96.                break;  

  97.             case PRODUCT_DATACENTER_SERVER_CORE:  

  98.                StringCchCat(pszOS, BUFSIZE, TEXT(“Datacenter Edition (core installation)” ));  

  99.                break;  

  100.             case PRODUCT_ENTERPRISE_SERVER:  

  101.                StringCchCat(pszOS, BUFSIZE, TEXT(“Enterprise Edition” ));  

  102.                break;  

  103.             case PRODUCT_ENTERPRISE_SERVER_CORE:  

  104.                StringCchCat(pszOS, BUFSIZE, TEXT(“Enterprise Edition (core installation)” ));  

  105.                break;  

  106.             case PRODUCT_ENTERPRISE_SERVER_IA64:  

  107.                StringCchCat(pszOS, BUFSIZE, TEXT(“Enterprise Edition for Itanium-based Systems” ));  

  108.                break;  

  109.             case PRODUCT_SMALLBUSINESS_SERVER:  

  110.                StringCchCat(pszOS, BUFSIZE, TEXT(“Small Business Server” ));  

  111.                break;  

  112.             case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:  

  113.                StringCchCat(pszOS, BUFSIZE, TEXT(“Small Business Server Premium Edition” ));  

  114.                break;  

  115.             case PRODUCT_STANDARD_SERVER:  

  116.                StringCchCat(pszOS, BUFSIZE, TEXT(“Standard Edition” ));  

  117.                break;  

  118.             case PRODUCT_STANDARD_SERVER_CORE:  

  119.                StringCchCat(pszOS, BUFSIZE, TEXT(“Standard Edition (core installation)” ));  

  120.                break;  

  121.             case PRODUCT_WEB_SERVER:  

  122.                StringCchCat(pszOS, BUFSIZE, TEXT(“Web Server Edition” ));  

  123.                break;  

  124.          }  

  125.       } 

  126.  

  127.       if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )  

  128.       { 

  129.          if( GetSystemMetrics(SM_SERVERR2) ) 

  130.             StringCchCat(pszOS, BUFSIZE, TEXT( “Windows Server 2003 R2, “));  

  131.          else if ( osvi.wSuiteMask & VER_SUITE_STORAGE_SERVER ) 

  132.             StringCchCat(pszOS, BUFSIZE, TEXT( “Windows Storage Server 2003”));  

  133.          else if ( osvi.wSuiteMask & VER_SUITE_WH_SERVER ) 

  134.             StringCchCat(pszOS, BUFSIZE, TEXT( “Windows Home Server”));  

  135.          else if( osvi.wProductType == VER_NT_WORKSTATION &&  

  136.                   si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)  

  137.          {  

  138.             StringCchCat(pszOS, BUFSIZE, TEXT( “Windows XP Professional x64 Edition”));  

  139.          }  

  140.          else StringCchCat(pszOS, BUFSIZE, TEXT(“Windows Server 2003, “));  

  141.  

  142.          // Test for the server type. 

  143.          if ( osvi.wProductType != VER_NT_WORKSTATION ) 

  144.          {  

  145.             if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 ) 

  146.             { 

  147.                 if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) 

  148.                    StringCchCat(pszOS, BUFSIZE, TEXT( “Datacenter Edition for Itanium-based Systems” ));  

  149.                 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) 

  150.                    StringCchCat(pszOS, BUFSIZE, TEXT( “Enterprise Edition for Itanium-based Systems” ));  

  151.             } 

  152.  

  153.             else if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 ) 

  154.             { 

  155.                 if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) 

  156.                    StringCchCat(pszOS, BUFSIZE, TEXT( “Datacenter x64 Edition” ));  

  157.                 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) 

  158.                    StringCchCat(pszOS, BUFSIZE, TEXT( “Enterprise x64 Edition” ));  

  159.                 else StringCchCat(pszOS, BUFSIZE, TEXT( “Standard x64 Edition” ));  

  160.             } 

  161.  

  162.             else 

  163.             { 

  164.                 if ( osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER ) 

  165.                    StringCchCat(pszOS, BUFSIZE, TEXT( “Compute Cluster Edition” ));  

  166.                 else if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) 

  167.                    StringCchCat(pszOS, BUFSIZE, TEXT( “Datacenter Edition” ));  

  168.                 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) 

  169.                    StringCchCat(pszOS, BUFSIZE, TEXT( “Enterprise Edition” ));  

  170.                 else if ( osvi.wSuiteMask & VER_SUITE_BLADE ) 

  171.                    StringCchCat(pszOS, BUFSIZE, TEXT( “Web Edition” ));  

  172.                 else StringCchCat(pszOS, BUFSIZE, TEXT( “Standard Edition” ));  

  173.             } 

  174.          }  

  175.       } 

  176.  

  177.       if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )  

  178.       { 

  179.          StringCchCat(pszOS, BUFSIZE, TEXT(“Windows XP “));  

  180.          if( osvi.wSuiteMask & VER_SUITE_PERSONAL ) 

  181.             StringCchCat(pszOS, BUFSIZE, TEXT( “Home Edition” ));  

  182.          else StringCchCat(pszOS, BUFSIZE, TEXT( “Professional” ));  

  183.       } 

  184.  

  185.       if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )  

  186.       { 

  187.          StringCchCat(pszOS, BUFSIZE, TEXT(“Windows 2000 “));  

  188.  

  189.          if ( osvi.wProductType == VER_NT_WORKSTATION ) 

  190.          {  

  191.             StringCchCat(pszOS, BUFSIZE, TEXT( “Professional” ));  

  192.          }  

  193.          else   

  194.          {  

  195.             if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) 

  196.                StringCchCat(pszOS, BUFSIZE, TEXT( “Datacenter Server” ));  

  197.             else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) 

  198.                StringCchCat(pszOS, BUFSIZE, TEXT( “Advanced Server” ));  

  199.             else StringCchCat(pszOS, BUFSIZE, TEXT( “Server” ));  

  200.          }  

  201.       } 

  202.  

  203.        // Include service pack (if any) and build number. 

  204.  

  205.       if( _tcslen(osvi.szCSDVersion) > 0 )  

  206.       { 

  207.           StringCchCat(pszOS, BUFSIZE, TEXT(” “) );  

  208.           StringCchCat(pszOS, BUFSIZE, osvi.szCSDVersion);  

  209.       } 

  210.  

  211.       TCHAR buf[80];  

  212.  

  213.       StringCchPrintf( buf, 80, TEXT(” (build %d)”), osvi.dwBuildNumber);  

  214.       StringCchCat(pszOS, BUFSIZE, buf);  

  215.  

  216.       if ( osvi.dwMajorVersion >= 6 )  

  217.       { 

  218.          if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 ) 

  219.             StringCchCat(pszOS, BUFSIZE, TEXT( “, 64-bit” ));  

  220.          else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL ) 

  221.             StringCchCat(pszOS, BUFSIZE, TEXT(“, 32-bit”));  

  222.       } 

  223.        

  224.       return TRUE;  

  225.    }  

  226.  

  227.    else 

  228.    {    

  229.       printf( “This sample does not support this version of Windows.n”);  

  230.       return FALSE;  

  231.    }  

  232. }  

  233.  

  234. int __cdecl _tmain()  

  235. {  

  236.     TCHAR szOS[BUFSIZE];  

  237.  

  238.     if( GetOSDisplayString( szOS ) )  

  239.         _tprintf( TEXT(“n%sn”), szOS );  

  240. }  



좀더 간략한 정보를 얻는 것이 목적이라면 다음과 같이 수정할 수 있습니다[ 2000 이하의 OS는 생각하지 않았습니다 ]





  1. CString Get_Os_Info()  

  2. {  

  3.  

  4.     CString Os_info;  

  5.  

  6.     DWORD dwType;  

  7.  

  8.     char version = -1;  

  9.     OSVERSIONINFOEX osvi;  

  10.     SYSTEM_INFO sys;  

  11.      

  12.     GetSystemInfo(&sys);  

  13.  

  14.        

  15.     BOOL version_ex_flag = 0;  

  16.        

  17.     ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));  

  18.    

  19.     osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);  

  20.        

  21.     if(!(version_ex_flag = GetVersionEx((OSVERSIONINFO *)&osvi))){  

  22.         osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);  

  23.         if(!GetVersionEx((OSVERSIONINFO *)&osvi)) return -1;  

  24.     } 

  25.    

  26.  

  27.     switch(osvi.dwMajorVersion){  

  28.  

  29.     case 5:  

  30.         if (osvi.dwMinorVersion == 0)  

  31.             Os_info = “Windows 2000”;  

  32.  

  33.         else if ( osvi.dwMinorVersion == 1)  

  34.             Os_info = “Windows XP”;  

  35.  

  36.         else   

  37.         { 

  38.             if(osvi.wSuiteMask & VER_SUITE_WH_SERVER)  

  39.                 Os_info =” Windows Home Server”;  

  40.  

  41.             else if ((osvi.wProductType == VER_NT_WORKSTATION)  

  42.                 && (sys.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64))  

  43.                 Os_info =“Windows XP Professional x64 Edition”;  

  44.              

  45.             if(GetSystemMetrics(SM_SERVERR2) == 0 )  

  46.                     Os_info = “Windows Server 2003 “;  

  47.             else   

  48.                     Os_info = “Windows Server 2003 R2 “;  

  49.         } 

  50.  

  51.         break;  

  52.     case 6:  

  53.         if (osvi.dwMinorVersion == 0)  

  54.         { 

  55.             if(osvi.wProductType == VER_NT_WORKSTATION)  

  56.                 Os_info = “Windows Vista”;  

  57.             else 

  58.                 Os_info = “Windows Server 2008”;  

  59.         } 

  60.  

  61.         else if ( osvi.dwMinorVersion == 1)  

  62.         { 

  63.             if(osvi.wProductType == VER_NT_WORKSTATION)  

  64.                 Os_info = “Windows 7”;  

  65.             else 

  66.                 Os_info = “Windows Server 2008 R2 “;  

  67.         } 

  68.         break;  

  69.  

  70.         default:  

  71.             return “Unknown OS”;  

  72.     } 

  73.  

  74.  

  75.        

  76.     return Os_info;  

  77.  

  78.  

  79. }  


다른 방법으로 레지스트리에서 가져오는 방법도 있습니다 이 방법이 가장 간단하군요





  1. CString Get_Os_Info()  

  2. {  

  3.  

  4.     TCHAR ProductName[100];  

  5.     TCHAR CSDVersion[100];  

  6.     CString Os_info;  

  7.  

  8.     HKEY hKey;  

  9.     int i = 0;  

  10.      

  11.     DWORD c_size = 100;  

  12.      

  13.     if( RegOpenKeyEx(HKEY_LOCAL_MACHINE,“SOFTWARE\Microsoft\Windows NT\CurrentVersion\”,0,KEY_QUERY_VALUE,&hKey) != ERROR_SUCCESS ) 

  14.         return “Fail to Open Os_info”;  

  15.          

  16.     if(RegQueryValueEx (hKey, “ProductName”, NULL, NULL, (LPBYTE) ProductName,    &c_size) != ERROR_SUCCESS)  

  17.         return “Fail to Load the ProductName”;  

  18.      

  19.     if(RegQueryValueEx (hKey, “CSDVersion”, NULL, NULL, (LPBYTE) CSDVersion ,    &c_size) != ERROR_SUCCESS)  

  20.     { 

  21.         RegCloseKey (hKey);  

  22.         return ProductName;  

  23.     } 

  24.  

  25.      

  26.     Os_info = ProductName;  

  27.     Os_info += ” “;  

  28.     Os_info += CSDVersion;  

  29.  

  30.     RegCloseKey (hKey);  

  31.  

  32.     return Os_info;  

  33.      

  34. }  




4. Hard Disk Information 가져오기
– GetDiskFreeSpaceEX

하드의 사용용량/ 전체용량을 구합니다











  1. CString Get_PhyDriver_Info()  

  2. {  

  3.      

  4.     CString Use, Total;  

  5.     ULARGE_INTEGER nFreeBytes;  

  6.     ULARGE_INTEGER nTotalBytes;  

  7.     ULARGE_INTEGER nTotalOfFree;  

  8.  

  9.     if ( GetDiskFreeSpaceEx( _T(“C:”), &nFreeBytes, &nTotalBytes, &nTotalOfFree ) == NULL)  

  10.         return “Fail to load Driver Info”;  

  11.  

  12.      

  13.     // Total – Free  = Use 

  14.     Use.Format(“%d”,nTotalBytes.QuadPart/1024/1024 – nFreeBytes.QuadPart/1024/1024);  

  15.     Use += “MB / “;  

  16.     // Free 

  17.     Total.Format(“%d”,nTotalBytes.QuadPart/1024/1024);  

  18.     Total += “MB”;  

  19.  

  20.  

  21.     return Use+Total;  

  22.  

  23.  

  24. }  





5. IP Information 가져오기
– gethostname -> gethostbyname

IP를  한번에 가져오는 API 없고 다음과 같이 2개의 API를 이용하는 방법이 있습니다
















  1. CString Get_Ip()  

  2. {  

  3.     WSADATA wsadata;  

  4.    

  5. if( !WSAStartup( DESIRED_WINSOCK_VERSION, &wsadata ) )  

  6. {  

  7.    if( wsadata.wVersion >= MINIMUM_WINSOCK_VERSION ) 

  8.    {  

  9.       CString str; // 이 변수에 IP주소가 저장된다. 

  10.       HOSTENT *p_host_info;  

  11.       IN_ADDR in;  

  12.       char host_name[128]={0, };  

  13.      

  14.       gethostname(host_name, 128);  

  15.       p_host_info = gethostbyname( host_name );  

  16.      

  17.       if( p_host_info != NULL ) 

  18.       { 

  19.          for( int i = 0; p_host_info->h_addr_list[i]; i++ ) 

  20.          {  

  21.             memcpy( &in, p_host_info->h_addr_list[i], 4 );  

  22.             str = inet_ntoa( in );  

  23.          }  

  24.       } 

  25.       return str;  

  26.   }   

  27. WSACleanup();  

  28.  

  29.  

  30. }  

  31.  

  32. return “Fail”;  

  33. }  




6. Mac Address 가져오기

GetAdaptersInfo


UuidCreate


NetWkstaTransportEnum  NETBIOS 이용

Mac Address를 가져오는 방법은 좀 다양한데 대표적인 3가지 방법이 위 3 가지 입니다

그중에서 저는 GetAdaptersInfo를 이용해서 구해보도록 하죠











  1. CString Get_Mac()  

  2. {  

  3.  

  4.     CString strMac;  

  5.     DWORD size = sizeof(PIP_ADAPTER_INFO);  

  6.  

  7.     PIP_ADAPTER_INFO Info;  

  8.  

  9.     ZeroMemory( &Info, size );  

  10.  

  11.     int result = GetAdaptersInfo( Info, &size );        // 첫번째 랜카드 MAC address 가져오기 

  12.  

  13.     if (result == ERROR_BUFFER_OVERFLOW)    // GetAdaptersInfo가 메모리가 부족하면 재 할당하고 재호출 

  14.     { 

  15.         Info = (PIP_ADAPTER_INFO)malloc(size);  

  16.         GetAdaptersInfo( Info, &size );  

  17.     } 

  18.  

  19.     if(!Info)  

  20.         return strMac;  

  21.  

  22.     strMac.Format(“%0.2X-%0.2X-%0.2X-%0.2X-%0.2X-%0.2X”, Info->Address[0], Info->Address[1], Info->Address[2], Info->Address[3], Info->Address[4], Info->Address[5] );  

  23.  

  24.     return strMac;  

  25.  

  26.  

  27. }  


 

댓글 남기기