2010-07-17 136 views
3

可能重复:
Getting Machine’s MAC Address — Good Solution?
How do I get the MAC address of a network card using Delphi?如何在Windows7中获取MAC地址?

我使用MAC地址作为硬件ID为保护(ofcourse我已经加密了这个数据) 我使用下面的代码来获取MAC用户电脑上的地址

function MacAddress: string; 
var 
Lib: Cardinal; 
Func: function(GUID: PGUID): Longint; stdcall; 
GUID1, GUID2: TGUID; 
begin 
Result := ''; 
Lib := LoadLibrary('rpcrt4.dll'); 
if Lib <> 0 then 
begin 
    @Func := GetProcAddress(Lib, 'UuidCreateSequential'); 
    if Assigned(Func) then 
    begin 
    if (Func(@GUID1) = 0) and 
     (Func(@GUID2) = 0) and 
     (GUID1.D4[2] = GUID2.D4[2]) and 
     (GUID1.D4[3] = GUID2.D4[3]) and 
     (GUID1.D4[4] = GUID2.D4[4]) and 
     (GUID1.D4[5] = GUID2.D4[5]) and 
     (GUID1.D4[6] = GUID2.D4[6]) and 
     (GUID1.D4[7] = GUID2.D4[7]) then 
    begin 
     Result := 
     IntToHex(GUID1.D4[2], 2) + '-' + 
     IntToHex(GUID1.D4[3], 2) + '-' + 
     IntToHex(GUID1.D4[4], 2) + '-' + 
     IntToHex(GUID1.D4[5], 2) + '-' + 
     IntToHex(GUID1.D4[6], 2) + '-' + 
     IntToHex(GUID1.D4[7], 2); 
    end; 
    end; 
end; 
end; 

上面的代码工作完全在Windows XP 但其在Windows7给予不同的值,该值每改变后的计算机resratred :( 有越来越MAC地址的任何机会,这就是固定的时间(除非用户改变了他的MAC地址) 还是有在所有操作系统上修改常量数据的好代码?

在此先感谢

+0

什么让您认为[此代码](http://msdn.microsoft.com/en-us/library/aa379322%28VS.85%29.aspx)检索您的计算机的MAC地址? – 2010-07-17 04:08:47

+2

确认!该功能不返回MAC地址。它返回的值有时恰好包含MAC地址。 – Gabe 2010-07-17 05:04:33

回答

3

@ steve0,来检索网卡的MAC地址可以使用WMIWin32_NetworkAdapterConfiguration类和检查MACAddress属性。

检查这个代码:

program WMI_MAC; 

{$APPTYPE CONSOLE} 


uses 
    SysUtils 
    ,ActiveX 
    ,ComObj 
    ,Variants; 

function VarToStrNil(Value:Variant):string; //Dummy function to onvert an variant value to string 
begin 
    if VarIsNull(Value) then 
    Result:='' 
    else 
    Result:=VarToStr(Value); 
end; 


Procedure GetMacAddress; 
var 
    objWMIService : OLEVariant; 
    colItems  : OLEVariant; 
    colItem  : OLEVariant; 
    oEnum   : IEnumvariant; 
    iValue  : LongWord; 
    wmiHost, root, wmiClass: string; 

    function GetWMIObject(const objectName: String): IDispatch; 
    var 
    chEaten: Integer; 
    BindCtx: IBindCtx;//for access to a bind context 
    Moniker: IMoniker;//Enables you to use a moniker object 
    begin 
    OleCheck(CreateBindCtx(0, bindCtx)); 
    OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));//Converts a string into a moniker that identifies the object named by the string 
    OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));//Binds to the specified object 
    end; 

begin 
    wmiHost  := '.'; 
    root   := 'root\CIMV2'; 
    wmiClass  := 'Win32_NetworkAdapterConfiguration'; 
    objWMIService := GetWMIObject(Format('winmgmts:\\%s\%s',[wmiHost,root])); 
    colItems  := objWMIService.ExecQuery(Format('SELECT * FROM %s',[wmiClass]),'WQL',0); 
    oEnum   := IUnknown(colItems._NewEnum) as IEnumVariant; 
    while oEnum.Next(1, colItem, iValue) = 0 do 
    //if VarToStrNil(colItem.MACAddress)<>'' then //uncomment if you only want list the interfaces with mac adress 
    //if colItem.IPEnabled then // uncomment if you only want list the active interfaces 
    begin 
    WriteLn('Card Description '+VarToStrNil(colItem.Caption)); 
    WriteLn('MACAddress  '+VarToStrNil(colItem.MACAddress)); 
    end; 
end; 

begin 
try 
    CoInitialize(nil); 
    try   
     GetMacAddress; 
     Readln; 
    finally 
    CoUninitialize; 
    end; 
except 
    on E:Exception do 
    Begin 
     Writeln(E.Classname, ': ', E.Message); 
     Readln; 
    End; 
    end; 
end. 
0

下面是一些代码为网络上的任何一台计算机运行良好 - 可以尝试让自己的,使用“127.0.0.1”作为IP:

function GetRemoteMacAddress(const IP: AnsiString): TSockData; 
// implements http://msdn.microsoft.com/en-us/library/aa366358(VS.85).aspx 
type 
    TSendARP = function(DestIp: DWORD; srcIP: DWORD; pMacAddr: pointer; PhyAddrLen: Pointer): DWORD; stdcall; 
const 
    HexChars: array[0..15] of AnsiChar = 'ABCDEF'; 
var dwRemoteIP: DWORD; 
    PhyAddrLen: Longword; 
    pMacAddr : array [0..7] of byte; 
    I: integer; 
    P: PAnsiChar; 
    SendARPLibHandle: THandle; 
    SendARP: TSendARP; 
begin 
    result := ''; 
    SendARPLibHandle := LoadLibrary('iphlpapi.dll'); 
    if SendARPLibHandle<>0 then 
    try 
    SendARP := GetProcAddress(SendARPLibHandle,'SendARP'); 
    if @SendARP=nil then 
     exit; // we are not under 2K or later 
    dwremoteIP := inet_addr(pointer(IP)); 
    if dwremoteIP<>0 then begin 
     PhyAddrLen := 8; 
     if SendARP(dwremoteIP, 0, @pMacAddr, @PhyAddrLen)=NO_ERROR then begin 
     if PhyAddrLen=6 then begin 
      SetLength(result,12); 
      P := pointer(result); 
      for i := 0 to 5 do begin 
      P[0] := HexChars[pMacAddr[i] shr 4]; 
      P[1] := HexChars[pMacAddr[i] and $F]; 
      inc(P,2); 
      end; 
     end; 
     end; 
    end; 
    finally 
    FreeLibrary(SendARPLibHandle); 
    end; 
end; 

此代码是从我们的免费软件和开源框架SynCrtSock.pas中提取的。请参阅http://synopse.info/fossil