输出电脑的所有Mac地址


#include "stdafx.h"
#include <iostream.h>
#include <string>
#include <vector>
#include "windows.h"
using namespace std;

//命令行输出缓冲大小
const long MAX_COMMAND_SIZE = 10000;

//获取MAC命令行
char szFetCmd[] = "ipconfig /all";
//网卡MAC地址的前导信息
const string str4Search = "Physical Address. . . . . . . . . : ";

//用命令行方式获取网卡MAC地址
BOOL GetMacByCmd(char *lpszMac);

////////////////////////////////////////////////////////////////////////////
// 函数名: GetMacByCmd(char *lpszMac)
// 参数:
//      输入: void
//      输出: lpszMac,返回的MAC地址串
// 返回值:
//      TRUE:  获得MAC地址。
//      FALSE: 获取MAC地址失败。
// 过程:
//      1. 创建一个无名管道。
//      2. 创建一个IPCONFIG 的进程,并将输出重定向到管道。
//      3. 从管道获取命令行返回的所有信息放入缓冲区lpszBuffer。
//      4. 从缓冲区lpszBuffer中获得抽取出MAC串。
//
//  提示:可以方便的由此程序获得IP地址等其他信息。
//        对于其他的可以通过其他命令方式得到的信息只需改变strFetCmd 和
//        str4Search的内容即可。
///////////////////////////////////////////////////////////////////////////

BOOL GetMacByCmd(char *lpszMac)
{
 //初始化返回MAC地址缓冲区
 memset(lpszMac, 0x00, sizeof(lpszMac));
 BOOL bret;

 SECURITY_ATTRIBUTES sa;
    HANDLE hReadPipe,hWritePipe;

    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = NULL;
    sa.bInheritHandle = TRUE;
 
 //创建管道
 bret = CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);
 if(!bret)
 {
  return FALSE;
 }

 //控制命令行窗口信息
 STARTUPINFO si;
 //返回进程信息
    PROCESS_INFORMATION pi;

    si.cb = sizeof(STARTUPINFO);
    GetStartupInfo(&si);
    si.hStdError = hWritePipe;
    si.hStdOutput = hWritePipe;
    si.wShowWindow = SW_HIDE; //隐藏命令行窗口
    si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

 //创建获取命令行进程
 bret = CreateProcess (NULL, szFetCmd, NULL, NULL, TRUE, 0, NULL,
      NULL, &si, &pi );
 
 char szBuffer[MAX_COMMAND_SIZE+1]; //放置命令行输出缓冲区
 string strBuffer;
 vector<string> strBuffers;
 if (bret)
 {
  WaitForSingleObject (pi.hProcess, INFINITE);
  unsigned long count;
  CloseHandle(hWritePipe);

  memset(szBuffer, 0x00, sizeof(szBuffer));
  bret  =  ReadFile(hReadPipe,  szBuffer,  MAX_COMMAND_SIZE,  &count,  0);
  if(!bret)
  {
   //关闭所有的句柄
   CloseHandle(hWritePipe);
   CloseHandle(pi.hProcess);
   CloseHandle(pi.hThread);
   CloseHandle(hReadPipe);
   return FALSE;
  }
  else
  {
   strBuffer = szBuffer;
   long ipos = 0 ;

   while(1)
   {
    ipos = 0;
    ipos = strBuffer.find(str4Search,ipos);
    if(ipos == -1)
     break;
    //提取MAC地址串
    strBuffer = strBuffer.substr(ipos+str4Search.length());
    int ipos1 = strBuffer.find("\n");
    strBuffers.push_back(strBuffer.substr(0, ipos1));
    cout << strBuffers[strBuffers.size()-1].c_str();
    cout << endl;
   }
  }
 
 }
 memset(szBuffer, 0x00, sizeof(szBuffer));
 strcpy(szBuffer, strBuffers[0].c_str());

 //去掉中间的“00-50-EB-0F-27-82”中间的'-'得到0050EB0F2782
 int j = 0;
 for(int i=0; i<strlen(szBuffer); i++)
 {
  if(szBuffer[i] != '-')
  {
   lpszMac[j] = szBuffer[i];
   j++;
  }
 }

 //关闭所有的句柄
 CloseHandle(hWritePipe);
 CloseHandle(pi.hProcess);
 CloseHandle(pi.hThread);
 CloseHandle(hReadPipe);
 return TRUE;

}

extern BOOL GetMacByCmd(char *lpszMac);


void main (int argc, char *argv[])
{
 char lpszMac[128];
 memset(lpszMac, 0x00, sizeof(lpszMac));

 //获取MAC
 GetMacByCmd(lpszMac);

 //打印出MAC
 cout << lpszMac << endl;

 

//写入文件
 FILE *fp = NULL;
 fp = fopen("c:\\1.txt", "w");
 fwrite(lpszMac, sizeof(char), strlen(lpszMac), fp);
 fclose(fp);
}

posted @ 2010-05-12 22:53  zhouli  阅读(478)  评论(0编辑  收藏  举报