Windows在沒有TCP/IP協議的情況下獲取網卡MAC地址

Win NT/XP中,獲得網卡MAC地址,一般是通過netapi32.dll中的NetBIOS API發送NCBASTAT命令來獲取,但這樣做的前提是網絡連接啓用了TCP/IP協議,否則的話就不起作用,而且即使用ipconfig /all命令也看不到任何內容。

但MAC地址是固化在網卡硬件中的一個序列號,即使不安裝任何網絡協議也應該能讀取,最簡單的辦法是用Windows的wmic命令進行查詢:


  1. wmic nic where netconnectionid!=NULL get macaddress 

很 多人比較關心如何從註冊表中獲取MAC地址,其實註冊表中的MountPoints2項中的確是保存有MAC地址,但很難從其它設備中查找出來,比較好的 辦法是先從註冊表中找到網卡的設備編號,再通過DeviceIoControl查找硬件的MAC地址,以下是Perl Win32的實現:

 

  1. #!/usr/bin/perl -w 
  2.  
  3. use strict; 
  4.  
  5. use Win32API::File qw(CreateFile DeviceIoControl :FILE_SHARE_ :Misc); 
  6. use Win32::TieRegistry; 
  7.  
  8. #use Data::Dump qw(dump); 
  9.  
  10. sub IOCTL_NDIS_QUERY_GLOBAL_STATS () { 0x17 << 16 | 2 }; 
  11. sub OID_802_3_PERMANENT_ADDRESS   () { 0x01010101 }; 
  12. sub OID_802_3_CURRENT_ADDRESS     () { 0x01010102 }; 
  13.  
  14. sub NDIS_Query 
  15.     my ($handle, $oid) = @_; 
  16.     
  17.     my $nBytes = 0; 
  18.     my $buf = "\0"x10; 
  19.  
  20.     DeviceIoControl($handle, 
  21.                     IOCTL_NDIS_QUERY_GLOBAL_STATS(), 
  22.                     pack("L", $oid), 0, 
  23.                     $buf, length($buf), 
  24.                     $nBytes, 
  25.                     [] ); 
  26.     
  27.     return join "-", unpack("(a2)*", unpack("H*", $buf) ); 
  28.  
  29. my $adapters = $Registry->Open("LMachine/SOFTWARE/Microsoft/Windows NT/CurrentVersion/NetworkCards", { Access => "KEY_READ", Delimiter => "/" } ); 
  30.  
  31. #print dump($adapters); 
  32.  
  33. foreach(keys %$adapters) 
  34.     my $adapterName = $adapters->{$_}->{ServiceName}; 
  35.     print "Adapter name  = $adapterName\n"
  36.  
  37.     my $hMAC = CreateFile("//./$adapterName", 0, FILE_SHARE_READ(), [], OPEN_EXISTING(), 0, []); 
  38.  
  39.     for ( 
  40.  [ "permanent" => OID_802_3_PERMANENT_ADDRESS() ], 
  41.  [ "current  " => OID_802_3_CURRENT_ADDRESS()   ], 
  42.  ) { 
  43.  my ($type, $oid) = @$_; 
  44.   
  45.  my $mac = NDIS_Query($hMAC, $oid); 
  46.  print "MAC $type = $mac\n"
  47.     } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章