当前所在位置:珠峰网资料 >> 计算机 >> 计算机等级考试 >> 正文
输出电脑的所有Mac地址
发布时间:2010/5/14 11:07:27 来源:城市学习网 编辑:ziteng
  #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; [NextPage]   //创建获取命令行进程
  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);
  }
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved