1. 程式人生 > >獲取 Windows 作業系統版本資訊

獲取 Windows 作業系統版本資訊

// OSinfo.cpp : 定義控制檯應用程式的入口點。
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include "winsock.h"
#include <string>
#include <iostream>
using std::cout;using std::string;using std::iostream;
using std::endl;using std::ios;using std::fstream;
using std::ofstream;using std::cin;
#pragma comment( lib, "Ws2_32.lib" )
#define MAX_VALUE_NAME   256

//char osinfo[MAX_PATH][MAX_PATH];
char patchname[MAX_VALUE_NAME];

//全域性變數
char *LocalIP="";   //定義IP地址變數

//獲取本機ip
bool GetLocalIp()
{
        WSADATA wsaData;
        char name[255];//定義用於存放獲得的主機名的變數
        PHOSTENT hostinfo;
        //呼叫MAKEWORD()獲得Winsock版本的正確值,用於載入Winsock庫
        if ( WSAStartup( MAKEWORD(2,2), &wsaData ) == 0 )
        {
                //現在是載入Winsock庫,如果WSAStartup()函式返回值為0,說明載入成功,程式可以繼續
                if( gethostname ( name, sizeof(name)) == 0)
                {
                        //如果成功地將本地主機名存放入由name引數指定的緩衝區中
                        if((hostinfo = gethostbyname(name)) != NULL)
                        {
                                //這是獲取主機名,如果獲得主機名成功的話,將返回一個指標,指向hostinfo,hostinfo
                                //為PHOSTENT型的變數,下面即將用到這個結構體
                                LocalIP = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
                                //呼叫inet_ntoa()函式,將hostinfo結構變數中的h_addr_list轉化為標準的點分表示的IP
                                //地址(如192.168.0.1)
                                // printf("the ip is:%s/n",LocalIP);//輸出IP地址
                        }
                }
                WSACleanup( );//解除安裝Winsock庫,並釋放所有資源
               
        }
        return TRUE;
}

//顯示系統版本
bool DisplaySystemVesion(FILE *fp)
{
        OSVERSIONINFOEX osvi;
        BOOL bOsVersionInfoEx;
        //利用OSVERSIONINFOEX結構呼叫GetVersionEx()函式
        //如果呼叫失敗,可嘗試使用OSVERSIONINFO結構
        ZeroMemory(&osvi,sizeof(OSVERSIONINFOEX));
        osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);
        if(!(bOsVersionInfoEx=GetVersionEx((OSVERSIONINFO*)&osvi)))
        {
                //
                osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
                if(!GetVersionEx((OSVERSIONINFO*)&osvi))
                        return FALSE;
        }
        switch(osvi.dwPlatformId)
        {
        case VER_PLATFORM_WIN32_NT:
                //get os information
                if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
                {
                        printf("Microsoft Windows Server 2003 family ");
                        //fprintf( fp, "Microsoft Windows Server 2003 family ");
                        fprintf( fp, "WindowsServer2003");
                        // strcpy(osinfo[0],"Microsoft Windows Server 2003 family ");
                }
               
                if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
                {
                        printf("Microsoft Windows XP ");
                        //fprintf( fp, "Microsoft Windows XP ");
                        fprintf( fp, "WindowsXP");
                        //  strcpy(osinfo[0],"Microsoft Windows XP ");
                }
                if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
                {
                        printf("Microsoft Windows 2000 ");
                        //fprintf( fp, "Microsoft Windows 2000 ");
                        fprintf( fp, "Windows2000");
                        // strcpy(osinfo[0],"Microsoft Windows 2000 ");
                }
                if ( osvi.dwMajorVersion <= 4 )
                {
                        printf("Microsoft Windows NT ");
                        //fprintf( fp, "Microsoft Windows NT ");
                        fprintf( fp, "WindowsNT");
                        //   strcpy(osinfo[0],"Microsoft Windows NT ");
                }
                //
                if(bOsVersionInfoEx)
                {
                        if(osvi.wProductType==VER_NT_WORKSTATION)
                        {
                                printf("Professional ");
                                // fprintf(fp,"Professional ");
                        }
                        if(osvi.wProductType==VER_NT_SERVER)
                        {
                                printf("Server ");
                                // fprintf(fp,"Server ");
                        }
                        //printf("/n");
                        fprintf(fp,"/n");
                }
                else
                {
                        HKEY hKey;
                        char szProductType[80];
                        DWORD dwBufLen;
                        RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM//CurrentControlSet//Control//ProductOptions",0,KEY_QUERY_VALUE,&hKey);
                        RegQueryValueEx(hKey,"ProductType",NULL,NULL,(LPBYTE)szProductType,&dwBufLen);
                        RegCloseKey(hKey);
                       
                        if(lstrcmpi("WINNT",szProductType)==0)
                        {
                                printf("Workstation ");
                                // fprintf(fp,"Workstation ");
                        }
                        if(lstrcmpi("SERVERNT",szProductType)==0)
                        {
                                printf("Server ");
                                // fprintf(fp,"Server ");
                        }
                        //printf("/n");
                        fprintf(fp,"/n");
                }
               
                // Display service pack (if any) and build number.
                if( osvi.dwMajorVersion == 4 &&
                        lstrcmpi( osvi.szCSDVersion, "Service Pack 6" ) == 0 )
                {
                        HKEY hKey;
                        LONG lRet;
                        // Test for SP6 versus SP6a.
                        lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
                                "SOFTWARE//Microsoft//Windows NT//CurrentVersion//Hotfix//Q246009",
                                0, KEY_QUERY_VALUE, &hKey );
                        if( lRet == ERROR_SUCCESS )
                        {
                                printf( "Service Pack 6a (Build %d)/n", osvi.dwBuildNumber & 0xFFFF );
                                // fprintf( fp,"Service Pack 6a (Build %d)/n", osvi.dwBuildNumber & 0xFFFF );
                                // fprintf( fp,"Service Pack 6a/n" );
                                fprintf( fp,"6a/n" );
                        }
                        else // Windows NT 4.0 prior to SP6a
                        {
                                printf( "%s (Build %d)",osvi.szCSDVersion,osvi.dwBuildNumber & 0xFFFF);
                                /* printf( "%s (Build %d)/n",
                                osvi.szCSDVersion,
                                osvi.dwBuildNumber & 0xFFFF);
                                */
                                // fprintf( fp,"%s (Build %d)/n",
                                //  osvi.szCSDVersion,
                                //  osvi.dwBuildNumber & 0xFFFF);
                                // fprintf( fp,"%s/n",osvi.szCSDVersion);
                                fprintf( fp,"%s/n",osvi.szCSDVersion+13);  //去掉"Service Pack "共13個位元組,只保留最後的號
                        }
                        RegCloseKey( hKey );
                }
                else // Windows NT 3.51 and earlier or Windows 2000 and later
                {
                        printf( "%s (Build %d)",osvi.szCSDVersion,osvi.dwBuildNumber & 0xFFFF);
                        /*printf( "%s (Build %d)/n",
                        osvi.szCSDVersion,
                        osvi.dwBuildNumber & 0xFFFF);
                        */
                        // fprintf( fp,"%s (Build %d)/n",
                        //  osvi.szCSDVersion,
                        //  osvi.dwBuildNumber & 0xFFFF);
                        // fprintf( fp,"%s/n",osvi.szCSDVersion);
                        fprintf( fp,"%s/n",osvi.szCSDVersion+13);    //去掉"Service Pack "共13個位元組,只保留最後的號
                }
                break;
case VER_PLATFORM_WIN32_WINDOWS:
         if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
         {
                 printf("Microsoft Windows 95 ");
                 fprintf(fp,"Microsoft Windows 95 ");
                 if ( osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B' )
                 {
                         printf("OSR2");
                         fprintf(fp,"OSR2");
                         //  strcat(osinfo[0], "OSR2" );
                 }
                 printf("/n");
                 fprintf(fp,"/n");
         }
         if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
         {
                 printf("Microsoft Windows 98 ");
                 fprintf(fp,"Microsoft Windows 98 ");
                 if ( osvi.szCSDVersion[1] == 'A' )
                 {
                         printf("SE");
                         fprintf(fp,"SE");
                 }
                 printf("/n");
                 fprintf(fp,"/n");
         }
         if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
         {
                 printf("Microsoft Windows Millennium Edition/n");
                 fprintf(fp,"Microsoft Windows Millennium Edition/n");
         }
         break;
case VER_PLATFORM_WIN32s:
         printf(" Microsoft Win32s/n");
         fprintf(fp," Microsoft Win32s/n");
         break;
}
return TRUE;
}
void DisplaySetupedPatch(FILE *fp)
{
        HKEY hKey;
        // LONG lRet;
        // char Buf[80];
        // char lpBuf[80];
        DWORD i;
        DWORD retCode;
        // DWORD j;
        // DWORD retValue;
        DWORD dwxValueName=MAX_VALUE_NAME;
        LPCTSTR path="SOFTWARE//Microsoft//Windows NT//CurrentVersion//Hotfix";
        LONG return0=RegOpenKeyEx(HKEY_LOCAL_MACHINE,path,0,KEY_READ,&hKey);
        if(return0!=ERROR_SUCCESS)
        {
                printf("錯誤:無法開啟有關的鍵!");
        }
        for(i=1,retCode=ERROR_SUCCESS;retCode==ERROR_SUCCESS;i++)
        {
                retCode=RegEnumKey(hKey,i,patchname,MAX_PATH);
                if(retCode==ERROR_SUCCESS)
                {
                        printf("%s/n",patchname);
                        fprintf(fp,"%s/n",patchname);
                }
        }
       
}
void main()
{
        //寫入檔案
        FILE *fp;
        GetLocalIp();
        const char SaveReciveFilePath[]="f://";
        string abPath(SaveReciveFilePath);
        char Filename[512]="";
        strcpy(Filename,LocalIP);   //拷貝字串
        strcat(Filename,".txt");    //連線字串
        abPath += Filename;
        fp=fopen(abPath.c_str(),"w");
        while(fp==NULL);
        // printf("the LocalIP is:%s/n",LocalIP);//輸出IP地址
        printf("本機IP地址:%s/n",LocalIP);//輸出IP地址
        // fprintf(fp,"本機IP:%s/n",LocalIP);
        // fprintf(fp,"%s/n",LocalIP);
        bool a=FALSE;
        printf("本機作業系統版本是:");
        // fprintf(fp,"本機作業系統版本是:");
        //作業系統版本資訊
        while (a!=TRUE)
        {
                a=DisplaySystemVesion(fp);
        }
        //作業系統語言資訊
        printf("語言:");
        // fprintf(fp,"語言:");
        /* WORD wLangPID = PRIMARYLANGID( GetSystemDefaultLangID() );
        if( LANG_CHINESE == wLangPID )
        {
        printf("CHS/n");//中文
        fprintf(fp,"CHN/n");
        }
        else
        {
        printf("ENG/n"); //英文
        fprintf(fp,"ENG/n");
        }
        if( NULL == wLangPID )
        {
        printf( "Failure!/n" );
        }
        */
        int LanguageID=GetSystemDefaultLangID();   //返回作業系統語言的ID號
        switch(LanguageID)
        {
        case 0x0404:
                printf("CHT/n");//Chinese  Taiwan
                fprintf(fp,"CHT/n");
                break;
        case 0x0804:
                printf("CHS/n");//Chinese PRC
                fprintf(fp,"CHS/n");
                break;
        case 0x0c04:
                printf("ZHH/n");//Chinese Hong Kong SAR
                fprintf(fp,"ZHH/n");
                break;
        case 0x1004:
                printf("ZHH/n");//Chinese Singapore
                fprintf(fp,"ZHH/n");
                break;
        case 0x1404:
                printf("ZHM/n");//Chinese Macau SAR  
                fprintf(fp,"ZHM/n");
                break;
        case 0x0809:
                printf("ENG/n");//English United Kingdom
                fprintf(fp,"ENG/n");
                break;
        case 0x0409:
                printf("USA/n");//English United States  
                fprintf(fp,"USA/n");
                break;
        default:
                printf("Default/n");
                fprintf(fp,"Default/n");
                break;
        }
        // printf("%d/n",id);
        //作業系統已安裝補丁資訊
        printf("系統已經安裝的升級補丁有:/n");
        // fprintf(fp,"系統已經安裝的升級補丁有:/n");
        DisplaySetupedPatch(fp);
        fclose(fp);