zoukankan      html  css  js  c++  java
  • delphi 读取网卡mac的3种方式

    用硬件id加密程序,其中一项加密是用mac地址。
    mac如果是真实网卡信息是唯一的,不好的消息是网卡很容易就能虚拟,所以需要配合其它手段。
    现在有三种方式,各有利弊
    第一种 最简单也最实用,通过调用ipconfig -all 来取得网卡。
    第二种 通过netbios,因为是网络协议,如果网卡没有连接上,取不到mac地址
    第三种 通过rpc调用,只能得到一块网卡.在有多块网卡时会出现有时取到的MAC不一致.
    第一种
    function   MacAddress():   string;
    implementation
    function GetIpMacAddress(): TStringList;
    var
       files,re:TStringList;
       i:integer;
       row:String;
    begin
    re:=TStringList.Create;
    files:= TStringList.Create;
       winexec('cmd   /c ipconfig -all >c:/fastspeeed.txt',SW_HIDE);
       sleep(500);
        files.LoadFromFile('c:/fastspeeed.txt');
        for I := 0 to files.Count -1 do
        begin
         row:= files.Strings[i];
         if ContainsText(row,'Physical Address') then
         begin
         try
           re.Add(RightStr(row,17));
         Except
         end;
         end;
        end;
         winexec('cmd   /c del c:/fastspeeed.txt',SW_HIDE);
        Result:= re;
    end;
    第二种
    function GetMacAddress(): TStringList ;
    var
       re:TStringList;
       i:integer;
    begin
        re:=TStringList.Create;
        for I := 0 to 10 do
        begin
        try
          re.add(NBGetAdapterAddress(i));
        Except
           continue;
        end;
        end;
        Result:= re;
    end;
    function NBGetAdapterAddress(adapterNum: integer): String;
    //adapter00为指定的网卡适配器
    Var
       NCB:TNCB; // NetBios控制块
       ADAPTER : TADAPTERSTATUS; // 获取网卡状态
       LANAENUM : TLANAENUM; // Netbios lana
       intIdx : Integer; // 临时变量
       cRC : AnsiChar; // NetBios返回值
       strTemp : String; // 临时变量
    Begin
       Result := '';
       Try
         // 清空控制块
         ZeroMemory(@NCB, SizeOf(NCB));
         NCB.ncb_command:=Chr(NCBENUM);
         cRC := NetBios(@NCB);
         // 重新设置enum命令
         NCB.ncb_buffer := @LANAENUM;
         NCB.ncb_length := SizeOf(LANAENUM);
         cRC := NetBios(@NCB);
         If Ord(cRC)<>0 Then
           exit;
         // 重新设定网卡
         ZeroMemory(@NCB, SizeOf(NCB));
         NCB.ncb_command := Chr(NCBRESET);
         NCB.ncb_lana_num := LANAENUM.lana[adapterNum];
         cRC := NetBios(@NCB);
         If Ord(cRC)<>0 Then
           exit;
         // 获取网卡地址
         ZeroMemory(@NCB, SizeOf(NCB));
         NCB.ncb_command := Chr(NCBASTAT);
         NCB.ncb_lana_num := LANAENUM.lana[adapterNum];
         StrPCopy(NCB.ncb_callname, '*');
         NCB.ncb_buffer := @ADAPTER;
         NCB.ncb_length := SizeOf(ADAPTER);
         cRC := NetBios(@NCB);
         // 将获得信息转换为字符串
         strTemp := '';
         For intIdx := 0 To 5 Do
           strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[intIdx]),2);
         Result := strTemp;
       Finally
       End;
    end;
    第三种
    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;
  • 相关阅读:
    linux下ls出现文件的后缀有@,* ,/之类的解释
    对shell中cat 和EOF的理解
    linux中test的意义 又可以表示为[]
    Python程序中的进程操作-进程同步(multiprocess.Lock)
    Python程序中的进程操作-开启多进程
    进程的创建和结束
    同步异步阻塞非阻塞
    进程的并行和并发
    进程的调度
    进程基础
  • 原文地址:https://www.cnblogs.com/ljl_falcon/p/2405939.html
Copyright © 2011-2022 走看看