delphi 获取MAC地址
获取MAC地址方法
获取MAC地址和ip地址方法
一、获取本机MAC地址和ip地址方法:
方法一:
在桌面右下角找到“两个小电视”的图标(如果右下角没有,就在桌面右击“网上邻居”点属性,找到“本地连接”双击,也会出现本地属性状态窗口)
鼠标指向它右击---点状态
在状态窗口中点击“支持”标签
接着点击“详细信息”标签
实际地址就是MAC地址,其它信息还有ip地址,子网掩码,网关,还有dns服务器地址方法二:
点开始-运行,输入cmd,回车,然后输入:ipconfig(空格)/all 命令,回车,就一目了然的看到了
二、通过网络获取其它电脑MAC地址方法:
方法一:
点开始-运行,输入cmd,回车,然后输入:arp –a命令,回车,就看到局域网内所有电脑的MAC地址。
方法二:
点开始-运行,输入cmd,回车,然后输入:nbtstat -a 10.3.222.12 ,这样就可以查看某台具体机器的MAC地址(我这里举例查看的就是10.3.222.12这台机器的MAC地址)。
三、查看路由器MAC地址:
登录到路由器界面,找到状态,在状态中查看WAN口MAC地址。
大家看清楚,上报表中填写的路由器mac地址是要wan口的mac地址,而不是lan口的。
Delphi 中取本机的计算机名、IP地址、MAC地址、Windows登录的用户名
Delphi 中取本机的计算机名、IP地址、MAC地址、Windows登录的用户名--------------------------------------------------------------- uses Windows, WinSock;{ ComputerLocalIP }//取本机的 IP 地址function ComputerLocalIP: string;varch: array[1..32] of char;wsData: TWSAData;myHost: PHostEnt;i: integer;beginResult := '';if WSAstartup(2,wsData)<>0 then Exit; // can’t start winsocktryif GetHostName(@ch[1],32)<>0 then Exit; // getHostName failedexceptExit;end;myHost := GetHostByName(@ch[1]); // GetHostName errorif myHost=nil then exit;for i:=1 to 4 dobeginResult := Result + IntToStr(Ord(myHost.h_addr^[i-1]));if i<4 thenResult := Result + '.';end;end;//获取本机IP的MAC地址Function GetMacAddress: string;varLib: Cardinal;Func: function(GUID: PGUID): Longint; stdcall;GUID1, GUID2: TGUID;beginResult := '';Lib := LoadLibrary('rpcrt4.dll');if Lib <> 0 thenbeginif Win32Platform <>VER_PLATFORM_WIN32_NT then@Func := GetProcAddress(Lib, 'UuidCreate')else @Func := GetProcAddress(Lib, 'UuidCreateSequential'); if Assigned(Func) thenbeginif (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]) thenbeginResult :=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;FreeLibrary(Lib);end;end;//取本机的计算机名{ ComputerName }function ComputerName: string;varFStr: PChar;FSize: Cardinal;beginFSize := 255;GetMem(FStr, FSize);Windows.GetComputerName(FStr, FSize);Result := FStr;FreeMem(FStr);end;//取Windows登录用户名{ WinUserName }function WinUserName: string; varFStr: PChar;FSize: Cardinal;beginFSize := 255;GetMem(FStr, FSize);GetUserName(FStr, FSize); Result := FStr;FreeMem(FStr);end;。
如何获取网卡的MAC地址
如何获取网卡的MAC地址获取网卡的MAC地址可以通过以下几种方法:1.使用操作系统提供的命令行工具:不同的操作系统提供了不同的命令行工具来获取网卡的MAC地址。
下面分别介绍Windows和Linux操作系统下的方法。
- Windows操作系统:在命令提示符或PowerShell中输入"ipconfig /all"命令,会列出所有网络接口的详细信息,包括MAC地址。
- Linux操作系统:在终端中输入"ifconfig"命令,会列出所有网络接口的详细信息,包括MAC地址。
2.使用编程语言获取:可以使用各种编程语言(如Python、Java、C++等)提供的网络编程库来获取网卡的MAC地址。
下面以Python为例,演示如何通过编程获取网卡的MAC地址:```pythonimport subprocessimport redef get_mac_address(:result = subprocess.run(["ipconfig", "/all"],capture_output=True, text=True)output = result.stdoutmac_pattern = r"Physical Address[ .]*: (.*)"mac_address = re.findall(mac_pattern, output)[0].replace("-", ":")return mac_addressmac = get_mac_addressprint(mac)```这段代码通过执行"ipconfig /all"命令,并使用正则表达式匹配输出中的MAC地址,最终返回网卡的MAC地址。
3.使用网络管理工具:可以使用一些网络管理工具来获取网卡的MAC地址,这些工具通常提供了更丰富的功能和更友好的界面,比如Wireshark、NetCut等。
Windows中获取MAC地址的几种方法
Windows中获取MAC地址的几种方法1.NDIS(DDK)通过驱动程序获取MAC地址ndis规范中说明,网卡驱动程序支持ioctl_ndis_query_stats接口参数如下:OID_802_3_PERMANENT_ADDRESS :物理地址OID_802_3_CURRENT_ADDRESS :mac地址于是我们的方法就得到了。
首先,看看注册表,找一找网卡有几块,分别是什么设备名。
具体位置和os有关,2000下在hlm\software\microsoft\windows nt\current version\networkcards。
然后createfile(devicename,...)注意,要用linkname,因此还要加上"////.//device//".接着deviceiocontrol(hmac,IOCTL_NDIS_QUERY_STA TS,OID_802_3_PERMANENT_ADDRESS/OID_802_3_CURRENT_ADDRESS...)具体的情况可以参看ddk下的OID_802_3_CURRENT_ADDRESS条目API-2得到MAC (MSDN推荐方法)#include <windows.h>//#include <wincon.h>#include <stdlib.h>#include <stdio.h>#include <time.h>typedef struct _ASTA T_{ADAPTER_STA TUS adapt;NAME_BUFFER NameBuff [30];}ASTA T, * PASTA T;ASTA T Adapter;int main (void){NCB Ncb;UCHAR uRetCode;char NetName[50];LANA_ENUM lenum;int i;memset( &Ncb, 0, sizeof(Ncb) );Ncb.ncb_command = NCBENUM;Ncb.ncb_buffer = (UCHAR *)&lenum;Ncb.ncb_length = sizeof(lenum);uRetCode = Netbios( &Ncb );printf( "The NCBENUM return code is: 0x%x \n", uRetCode );for(i=0; i < lenum.length ;i++){memset( &Ncb, 0, sizeof(Ncb) );Ncb.ncb_command = NCBRESET;Ncb.ncb_lana_num = na;uRetCode = Netbios( &Ncb );printf( "The NCBRESET on LANA %d return code is: 0x%x \n",na, uRetCode );memset( &Ncb, 0, sizeof (Ncb) );Ncb.ncb_command = NCBASTA T;Ncb.ncb_lana_num = na;strcpy( Ncb.ncb_callname, "* " );Ncb.ncb_buffer = (char *) &Adapter;Ncb.ncb_length = sizeof(Adapter);uRetCode = Netbios( &Ncb );printf( "The NCBASTA T on LANA %d return code is: 0x%x \n",na, uRetCode );if ( uRetCode == 0 ){printf( "The Ethernet Number on LANA %d is:%02x%02x%02x%02x%02x%02x\n",na,Adapter.adapt.adapter_address[0],Adapter.adapt.adapter_address[1],Adapter.adapt.adapter_address[2],Adapter.adapt.adapter_address[3],Adapter.adapt.adapter_address[4],Adapter.adapt.adapter_address[5] );}}}3.用COM API获取网卡MAC地址这种方法使用COM API创建一个GUID(全局唯一标识符)并从那里继承MAC地址。
Delphi代码获取网卡物理地址
Delphi代码获取网卡物理地址Delphi代码获取网卡物理地址时间:2011-5-26来源:yang 作者: peng点击: 38次Delphi代码获取网卡物理地址转自: /coderush/articles/1171491.html 以下是我从MSDN中翻译过来的三个Delphi单元,调用任意一个单元中声明的API都可以获取网卡的物理地址,但三个单元中的API 函数的有效环境和功能各有不同,我把说明附于代码的注释中。
unit Lmwksta;interfaceusesWindows,SysUtils,Dialogs;type_WKSTA_TRANSPORT_INFO_0=packed recordwkti0_quality_of_service:DWORD;wkti0_number_of_vcs:DWORD;wkti0_transport_name:PWideChar;{连接设备名称,这个名称是\DEVICE\NetBT_TcpIp……我也不知道如何理解,不过我们只想获取MAC地址就不必管它了!}wkti0_transport_address:PWideChar; //MAC地址wkti0_wan_ish:BOOL; //是否是广域网连接end;WKSTA_TRANSPORT_INFO_0=_WKSTA_TRANSPORT_INFO_0;PWKSTA_TRANSPORT_INFO_0=^WKSTA_TRANSPORT_INFO _0;constNERR_Success=0;MAX_PREFERRED_LENGTH=$FFFFFFFF;//当本计算机有可用的网卡,且已经连接上网络时,调用本函数才能成功,否则获取不到任何信息function NetWkstaTransportEnum(ServerName:PWideChar;//主机名称,传递nil时表示本机Level:DWORD;//传递0BufPtr:PPointer; {接受_WKSTA_TRANSPORT_INFO_0记录数组的缓冲区,有此函数自行分配,但使用完后要用下面定义的NetApiBufferFree函数释放内存}PrefMaxLen:DWORD;//缓冲区最大长度,传递上面定义的MAX_PREFERRED_LENGTH常量即可EntriesRead,TotalEntries,ResumeHandle:PDWORD):DWORD; stdcall;{EntriesRead为返回的_WKSTA_TRANSPORT_INFO_0记录数组的元素个数,至于T otalEntries和ResumeHandle,可以传递nil,需要更深入的了解,请参见MSDN}function NetApiBufferFree(Buffer:Pointer):DWORD;stdcall;implementationfunction NetWkstaTransportEnum;external ‘netapi32.dll‘ name ‘NetWkstaTransportEnum‘;function NetApiBufferFree;external ‘netapi32.dll‘ name ‘NetApiBufferFree‘;end.unit Rpcdce;interfaceusesWindows,SysUtils;typeTUUID=packed recordData1:ULONG;Data2:Word;Data3:Word;Data4:array [0..7] of Byte;//此数组的后6个元素就是网卡的物理地址信息end;TGUID=TUUID;PUUID=^TUUID;const{以下为UuidCreateSequential函数的可能返回值}RPC_S_UUID_LOCAL_ONLY:LongInt=1824; //函数生成的GUID 只能保证在本计算机上是唯一的RPC_S_UUID_NO_ADDRESS:LongInt=1739; //不能获取以太网或令牌环网网卡设备RPC_S_OK:LongInt=0; //函数调用成功,生成的GUID中包含了网卡的物理地址信息function UuidCreateSequential(var uuid:TUUID):Cardinal;stdcall; //此函数只使用于单网卡的机器function GetMACAddress:string;implementationfunction UuidCreateSequential;external ‘Rpcrt4.dll‘ name ‘UuidCreateSequential‘;//引用此单元后,只需要调用GetMACAddress函数即可获得网卡物理地址function GetMACAddress:string;varuuid:TUUID;I:Integer;beginResult:=‘‘;if UuidCreateSequential(uuid)=RPC_S_OK thenfor I:=2 to 7 dobeginif I>2 then Result:=Result+‘-‘;Result:=Result+IntToHex(uuid.Data4[I],2);end;end;end.unit IPHlpAPI;interfaceusesWindows,SysUtils,Classes;constMAX_ADAPTER_DESCRIPTION_LENGTH=128;MAX_ADAPTER_NAME_LENGTH=256;MAX_ADAPTER_ADDRESS_LENGTH=8;DEFAULT_MINIMUM_ENTITIES=32;MAX_HOSTNAME_LEN=128;MAX_DOMAIN_NAME_LEN=128;MAX_SCOPE_ID_LEN=256;ERROR_NO_DATA:LongInt=232;ERROR_NOT_SUPPORTED:LongInt=50;ERROR_INVALID_PARAMETER:LongInt=87;ERROR_BUFFER_OVERFLOW:LongInt=111;typetime_t=Integer;IP_ADDRESS_STRING=packed recordAddr:array [0..15] of Char;end;PIP_ADDRESS_STRING=^IP_ADDRESS_STRING;IP_MASK_STRING=IP_ADDRESS_STRING;PIP_MASK_STRING=^IP_MASK_STRING;PIPAdapterInfo=^TIPAdapterInfo;TIPAdapterInfo=packed recordNext:PIPAdapterInfo;//下一个节点的指针ComboIndex:DWORD;AdapterName:array [0..MAX_ADAPTER_NAME_LENGTH + 3] of Char; //适配器名称Description:array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 3] of Char; //适配器描述信息AddressLength:UINT;//Address域的最大长度,传递MAX_ADAPTER_ADDRESS_LENGTH常量即可Address:array [0..MAX_ADAPTER_ADDRESS_LENGTH-1] of Byte;//适配器物理地址Index:DWORD;uType:UINT;DhcpEnabled:UINT;CurrentIpAddress:PIP_ADDRESS_STRING;IpAddressList:IP_ADDRESS_STRING;GatewayList:IP_ADDRESS_STRING;DhcpServer:IP_ADDRESS_STRING;HaveWins:BOOL;PrimaryWinsServer:IP_ADDRESS_STRING;SecondaryWinsServer:IP_ADDRESS_STRING;LeaseObtained:time_t;LeaseExpires:time_t;end;//此函数功能最强大,而且只要求网卡在系统中可用,并不要求一定连接上网络function GetAdaptersInfo(Buf:PIPAdapterInfo;var BufLen:ULONG):DWORD;stdcall;implementationfunction GetAdaptersInfo;external ‘iphlpapi.dll‘ name ‘GetAdaptersInfo‘;end.对于GetAdaptersInfo函数,Buf参数要求函数的调用者自行分配,如果分配的空间不足,函数返回ERROR_BUFFER_OVERFLOW,BufLen变参的值被设置为实际需要的缓冲区大小,因此可以再行分配,以满足需求,采用链表遍历操作可以获取所有已安装网卡的物理地址。
Delphi取电脑名称IP
本程序介绍如何获取本地计算机的名称和IP地址。
向窗体上添加两个TLabel组件、两个TEdit组件和一个TButton组件,设计完成的主界面如图1所示。
图1 主界面首先在程序的uses段中添加对WinSock的引用,然后添加一个GetHostName自定义函数,在其中调用GetComputerName函数获取计算机名称,响应代码如下:程序代码如下:unit Unit1;interfaceusesWindows, Messages, Sys Utils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, WinSock;typeTfrmMain = class(TForm)btnStart: TButton;edtIP: TEdit;edtName: TEdit;Label1: TLabel;Label2: TLabel;function GetHostName:String;procedure btnStartClick(Sender: TObject);function NameToIP(Name:string):String;private{ Private declarations }public{ Public declarations }end;varfrmMain: TfrmMain;implementation{$R *.dfm}function TfrmMain.GetHostName:String;varComputerName: array[0..MAX_COMPUTERNAME_LENGTH+1] of char;Size: Cardinal;beginresult:='';Size := MAX_COMPUTERNAME_LENGTH+1;GetComputerName(ComputerName, Size);Result:=StrPas(ComputerName);end;procedure TfrmMain.btnStartClick(Sender: TObject);beginedtName.Text:=GetHostName;edtIP.Text:=NameToIP(edtName.Text);保存文件,然后按F9键运行程序,程序运行的初始画面如图2所示。
Delphi得到局域网内所有电脑的名称和IP地址
Delphi得到局域网内所有电脑的名称和IP地址unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, WinSock, StdCtrls;typeTForm1 = class(TForm)ListBox1: TListBox;procedure FormCreate(Sender: TObject);privatefunction GetServerList(List: TStringList): Boolean;function GetUsers(const GroupName: String; List: TStringList): Boolean;{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}function TForm1.GetServerList(List: TStringList): Boolean;typeTNetResourceArray = ^TNetResource; //网络类型的数组varNetResource: TNetResource;Buf: Pointer;Count, BufSize, Res: DWORD;lphEnum: THandle;p: TNetResourceArray;i, j: SmallInt;NetworkTypeList: TList;beginResult := False;NetworkTypeList := TList.Create;List.Clear;//获取整个网络中的文件资源的句柄,lphEnum为返回名柄Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,RESOURCEUSAGE_CONTAINER, nil, lphEnum);if Res <> NO_ERROR then Exit; //Raise Exception(Res);//执行失败//获取整个网络中的网络类型信息Count := $FFFFFFFF; //不限资源数目BufSize := 8192; //缓冲区大小设置为8KGetMem(Buf, BufSize); //申请内存,用于获取工作组信息Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);if (Res = ERROR_NO_MORE_ITEMS) //资源列举完毕or (Res <> NO_ERROR) //执行失败then Exit;P := TNetResourceArray(Buf);for I := 0 to Count - 1 do begin//记录各个网络类型的信息NetworkTypeList.Add(p);Inc(P);end;//WNetCloseEnum关闭一个列举句柄Res := WNetCloseEnum(lphEnum); //关闭一次列举if Res <> NO_ERROR then exit;for J := 0 to NetworkTypeList.Count - 1 do begin//列出各个网络类型中的所有工作组名称//列出一个网络类型中的所有工作组名称NetResource := TNetResource(NetworkTypeList.Items[J]^); //网络类型信息//获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,RESOURCEUSAGE_CONTAINER, @NetResource, lphEnum);if Res <> NO_ERROR then break; //执行失败while true do begin//列举一个网络类型的所有工作组的信息Count := $FFFFFFFF; //不限资源数目BufSize := 8192; //缓冲区大小设置为8KGetMem(Buf, BufSize); //申请内存,用于获取工作组信息//获取一个网络类型的文件资源信息,Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);if (Res = ERROR_NO_MORE_ITEMS) //资源列举完毕or (Res <> NO_ERROR) //执行失败then Break;P := TNetResourceArray(Buf);for I := 0 to Count - 1 do begin//列举各个工作组的信息List.Add(StrPAS(P^.lpRemoteName)); //取得一个工作组的名称Inc(P);end;end;Res := WNetCloseEnum(lphEnum); //关闭一次列举if Res <> NO_ERROR then break; //执行失败end;Result := True;FreeMem(Buf);NetworkTypeList.Destroy;end;function TForm1.GetUsers(const GroupName: String; List: TStringList): Boolean;typeTNetResourceArray = ^TNetResource; //网络类型的数组varNetResource: TNetResource;Buf: Pointer;Count, BufSize, Res: DWord;Ind: Integer;lphEnum: THandle;Temp: TNetResourceArray;beginResult := False;List.Clear;FillChar(NetResource, SizeOf(NetResource), 0); //初始化网络层次信息NetResource.lpRemoteName := @GroupName[1]; //指定工作组名称NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER; //类型为服务器(工作组)NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;NetResource.dwScope := RESOURCETYPE_DISK; //列举文件资源信息//获取指定工作组的网络资源句柄Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,RESOURCEUSAGE_CONTAINER, @NetResource, lphEnum);if Res <> NO_ERROR then Exit; //执行失败while True do begin//列举指定工作组的网络资源Count := $FFFFFFFF; //不限资源数目BufSize := 8192; //缓冲区大小设置为8KGetMem(Buf, BufSize); //申请内存,用于获取工作组信息//获取计算机名称Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);if Res = ERROR_NO_MORE_ITEMS then break; //资源列举完毕if (Res <> NO_ERROR) then Exit; //执行失败Temp := TNetResourceArray(Buf);for Ind := 0 to Count - 1 do begin//列举工作组的计算机名称//获取工作组的计算机名称,+2表示删除"\\\\",如\\\\wangfajun=>wangfajunList.Add(Temp^.lpRemoteName + 2);Inc(Temp);end;FreeMem(Buf);end;Res := WNetCloseEnum(lphEnum); //关闭一次列举if Res <> NO_ERROR then exit; //执行失败Result := True;end;procedure TForm1.FormCreate(Sender: TObject);varWSAData: TWSAData;HostEnt: PHostEnt;sIP: String;i, j: Integer;list1, list2: TStringList;beginWSAStartup(2, WSAData);list1 := TStringList.Create;list2 := TStringList.Create;if GetServerList(list1) then beginfor i := 0 to list1.Count - 1 do beginif not GetUsers(list1.Strings[i], list2) then Continue;for j := 0 to list2.Count - 1 do beginHostEnt := gethostbyname(PChar(list2.Strings[j]));if HostEnt <> nil then beginwith HostEnt^ dosIP := Format('%d.%d.%d.%d', [Byte(h_addr^[0]), Byte(h_addr^[1]), Byte(h_addr^[2]), Byte(h_addr^[3])]);end;ListBox1.Items.Add(list2.Strings[j]+','+sIP);end;end;end;list1.Free;list2.Free; WSACleanup; end;end.。
Delphi获取文件夹路径的三种方式
Delphi获取⽂件夹路径的三种⽅式问题⼀:在Win98中右击“我的⽂档”,选属性,在弹出的“我的⽂档属性”窗⼝中点击“浏览”按钮就会弹出⼀个“浏览⽂件夹”对话框。
请问这个对话框是怎么做出来的? 答案:要做这个对话框有三种⽅法。
(⼀)第⼀种⽅法是⽤Delphi提供的组件(在Win 3.1⾯板上)模仿在上⾯看到的对话框⾃⼰组装⼀个“浏览⽂件夹”窗体。
具体的做法是: 1.在你的Project⾥增加⼀个BorderStyle为bsDialog的新窗体; 2.放置⼀个DirectoryListBox组件; 3.放置⼀个DriveComboBox组件,设置DirList为DirectoryListBox1; 4.然后再放上两个Button。
⼀个“确定”(ModalResult为mrOk),⼀个“取消” (ModalResult为mrCancel); 5.最后只要在调⽤这个浏览⽂件夹的地⽅加上⼀下代码就算⼤功告成了: if Form2.ShowModal = mrOk then Memo1.Lines.Add(Form2.DirectoryListBox1.Directory); (⼆)第⼆种⽅法,在Delphi中可以通过调⽤SelectDirectory函数得到这种效果。
SelectDirectory在Delphi 4中的申明如下(请注意,⼀共有两个重载的申明): type TSelectDirOpt = (sdAllowCreate, sdPerformCreate, sdPrompt); TSelectDirOpts = set of TSelectDirOpt; function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint): Boolean; overload; function SelectDirectory(const Caption: string; const Root:WideString; out Directory: string): Boolean; overload; 第⼀种语法的Options参数指定了“浏览⽂件夹”对话框的⼀些选项;参数HelpCtx指定上下⽂敏感的Help ID;Directory初始化了对话框的值,并且携带返回值。
delphi获取路径
delphi获取路径摘要:1.Delphi简介2.获取路径的方法一:使用Delphi内置函数3.获取路径的方法二:使用操作系统函数4.获取路径的方法三:使用第三方库5.总结与建议正文:Delphi是一种强大的编程语言,广泛应用于各种领域。
在Delphi编程中,获取路径是一项基本操作。
本文将介绍三种获取路径的方法,分别为使用Delphi内置函数、操作系统函数以及第三方库。
一、Delphi简介Delphi是一种基于Object Pascal的编程语言,由Borland公司开发。
它具有集成开发环境(IDE)和丰富的组件库,便于开发人员快速构建各种应用程序。
Delphi支持跨平台开发,可以编译成Windows、Linux和Mac OS等操作系统上的可执行文件。
二、获取路径的方法一:使用Delphi内置函数Delphi内置了许多实用的函数,其中可以使用`System.Directory`单元中的`GetCurrentDirectory()`函数获取当前目录。
以下是一个简单的示例:```pascalusesSystem.Directory;procedure TForm1.Button1Click(Sender: TObject);beginMemo1.Lines.Add(GetCurrentDirectory());end;```三、获取路径的方法二:使用操作系统函数Delphi还支持调用操作系统提供的函数,如Windows操作系统下的`GetWindowsDirectory()`和`GetSystemDirectory()`函数。
以下是一个示例:```pascalusesWinInet;procedure TForm1.Button1Click(Sender: TObject);beginMemo1.Lines.Add(GetWindowsDirectory());Memo1.Lines.Add(GetSystemDirectory());end;```四、获取路径的方法三:使用第三方库除了Delphi内置函数和操作系统函数外,还可以使用第三方库来实现路径获取功能。
获取客户端Mac地址
获取客户端Mac地址近期有个需求,需要获取客户端Mac地址作为⽩名单验证的依据。
使⽤.net,B/S架构。
先百度找了⼀些获取mac地址的⽅法,using System;using System.Collections.Generic;using System.Text;using System.Text.RegularExpressions;using System.IO;using ;using System.Configuration;using System.Web;using System.Security.Cryptography;using System.Data;using System.Web.UI.WebControls;using System.Management;using System.Diagnostics;using workInformation;using System.Runtime.InteropServices;namespace mon{public class MacAddress{#region获取mac地址的⼀些⽅法#region 1 通过IPConfig命令读取MAC地址(选⽤)///<summary>///根据截取ipconfig /all命令的输出流获取⽹卡Mac///</summary>///<returns></returns>public static List<string> GetMacByIPConfig(){List<string> macs = new List<string>();try{ProcessStartInfo startInfo = new ProcessStartInfo("ipconfig", "/all");eShellExecute = false;startInfo.RedirectStandardInput = true;startInfo.RedirectStandardOutput = true;startInfo.RedirectStandardError = true;startInfo.CreateNoWindow = true;Process p = Process.Start(startInfo);// 截取输出流StreamReader reader = p.StandardOutput;string line = reader.ReadLine();while (!reader.EndOfStream){if (!string.IsNullOrEmpty(line)){line = line.Trim();if (line.StartsWith("Physical Address") || line.StartsWith("物理地址")){macs.Add(line.Substring(line.IndexOf(":") + 1, line.Length - line.IndexOf(":") - 1));break;}}line = reader.ReadLine();}// 等待程序执⾏完退出进程p.WaitForExit();p.Close();reader.Close();}catch (Exception ex) {}return macs;}#endregion#region 2 通过WMI读取MAC地址///<summary>///通过WMI读取系统信息⾥的⽹卡MAC///该⽅法依赖WMI的系统服务,该服务⼀般不会被关闭;但如果系统服务缺失或者出现问题,该⽅法⽆法取得MAC地址。
获得及设置本机的ip地址,子网掩码,网关,dns服务器信息(Delphi)
获得及设置本机的ip地址,子网掩码,网关,dns服务器信息(Delphi)1、//取IP地址function GetIP : string;typeTaPInAddr = array [0..10] of PInAddr;PaPInAddr = ^TaPInAddr;varphe : PHostEnt;pptr : PaPInAddr;Buffer : array [0..63] of char;I : Integer;GInitData : TWSADATA;beginWSAStartup($101, GInitData);Result := '';GetHostName(Buffer, SizeOf(Buffer));phe :=GetHostByName(buffer);if phe = nil then Exit;pptr := PaPInAddr(Phe^.h_addr_list);I := 0;while pptr^[I] <> nil do beginresult:=StrPas(inet_ntoa(pptr^[I]^));Inc(I);end;WSACleanup;end;2、获取路由、网关信息、网卡信息:Procedure TForm1.Button1Click(Sender:TObject);beginMemo1.Lines.Clear;if FileExists(Temp) thenDeleteFile(Temp);WinExec(PChar(' /C route print >'+Temp),SW_HIDE);while not FileExists(Temp) doSleep(1000)TryMemo1.Lines.LoadFromFile(Temp);exceptend;end;3、所有信息function LocalIP:string;typeTaPInAddr = array [0..10] of PInAddr;PaPInAddr = ^TaPInAddr;varphe : PHostEnt;pptr : PaPInAddr;Buffer : array [0..63] of char;I : Integer;GInitData : TWSADATA;beginWSAStartup($101, GInitData);Result := '';GetHostName(Buffer, SizeOf(Buffer));phe :=GetHostByName(buffer);if phe = nil then Exit;pptr := PaPInAddr(Phe^.h_addr_list);I := 0;while pptr^[I] <> nil do beginresult:=StrPas(inet_ntoa(pptr^[I]^));Inc(I);end;WSACleanup;end;program get_ip;useswinsock,sysutils;VARch : ARRAY[1..32] OF Char;i : Integer;WSData: TWSAData;MyHost: PHostEnt;beginIF WSAstartup(2,wsdata)<>0 THENBEGINWriteln('can''t start Winsock: Error ',WSAGetLastError); Halt(2);END;tryIF getHostName(@ch[1],32)<>0 THENBEGINWriteln('getHostName failed');Halt(3);END;exceptWriteln('getHostName failed');halt(3);end;MyHost:=GetHostByName(@ch[1]);IF MyHost=NIL THENBEGINWriteln(GetHostName('+StrPas(@ch[1])+') failed : Error '+IntT oStr(WSAGetLastError));Halt(4);ENDELSEBEGINWrite('address ');FOR i:=1 TO 4 DOBEGINWrite(Ord(MyHost.h_addr^[i-1]));IF i<4 THENthen write('.')ELSEwriteln;END;END;end.4、获取路由、网关信息、网卡信息:Procedure TForm1.Button1Click(Sender:TObject); beginMemo1.Lines.Clear;if FileExists(Temp) thenDeleteFile(Temp);WinExec(PChar(' /C route print >'+Temp),SW_HIDE);while not FileExists(Temp) doSleep(1000)TryMemo1.Lines.LoadFromFile(Temp);exceptend;end;5、MAC代码:procedure TForm1.Button1Click(Sender: TObject);VarNCB : TNCB;ADAPTER : TADAPTERSTATUS;LANAENUM : TLANAENUM;intIdx : Integer;re : Char;buf : String;beginTry{ ZeroMemory(@NCB, SizeOf(NCB));NCB.ncb_command := Chr(NCBENUM);re := NetBios(@NCB);// Reissue enum commandNCB.ncb_buffer := @LANAENUM;NCB.ncb_length := SizeOf(LANAENUM);re := NetBios(@NCB);If Ord(re)<>0 Thenexit;}{ Copyright (C) Bowman }{**********************}// Reset adapterZeroMemory(@NCB, SizeOf(NCB));NCB.ncb_command := Chr(NCBRESET);NCB.ncb_lana_num := na[0];//importantre := NetBios(@NCB);If Ord(re)<>0 Thenexit;// Get adapter addressZeroMemory(@NCB, SizeOf(NCB));NCB.ncb_command := Chr(NCBASTAT);NCB.ncb_lana_num := na[0];////bowmanStrPCopy(NCB.ncb_callname, '*');NCB.ncb_buffer := @ADAPTER;NCB.ncb_length := SizeOf(ADAPTER);re := NetBios(@NCB);If Ord(re)<>0 Thenexit;buf := '';For intIdx := 0 To 5 Dobuf := buf + InttoHex(Integer(ADAPTER.adapter_address[intIdx]),2)+'-';edit1.Text := copy(buf,0,length(buf)-1);FinallyEnd;end;6、取子网隐码:procedure TForm1.Button1Click(Sender: TObject);varreg:TRegistry;re:boolean;device:string;buf:pchar;mask:string;adapter:string;beginreg:=TRegistry.Create();tryReg.RootKey := HKEY_LOCAL_MACHINE;//open key//win NT//get bind devicere:=Reg.OpenKey('SYSTEM\CurrentControlSet\Services\Tcpi p\Linkage',false);if re thenbegingetmem(buf,1024);Reg.ReadBinaryData('Bind',buf^,1024);device := strpas(buf);freemem(buf);endelsebeginedit1.text:='Failed to get bind device';reg.closekey();reg.Free;exit;end;reg.CloseKey;//get adapteradapter:=copy(device,2,length(device)-1);showmessage(adapter);adapter:=copy(adapter,POS('\',adapter)+1,length(adapter)-POS('\',adapter));showmessage(adapter);//queryre:=Reg.OpenKey('SYSTEM\CurrentControlSet\Services\'+ adapter+'\Parameters\T cpip',false);if re thenbegingetmem(buf,1024);Reg.ReadBinaryData('SubnetMask',buf^,1024);mask := strpas(buf);freemem(buf);endmask:='Failed to get subnet mask';finallyReg.CloseKey;Reg.Free;end;edit1.text:=device;edit2.text:=mask;end;7、子网隐码WIn98下:procedure TForm1.Button1Click(Sender: TObject);varreg:TRegistry;re:boolean;mask:string;beginreg:=TRegistry.Create();tryReg.RootKey := HKEY_LOCAL_MACHINE;//open key//win 9xre:=Reg.OpenKey('System\CurrentControlSet\Services\Class \NetTrans\0000',false);if re thenbeginmask := Reg.Readstring('IPMask');endbeginedit1.text:='Failed to get mask';reg.closekey();reg.Free;exit;end;finallyReg.CloseKey;Reg.Free;end;edit1.text:=mask;end;8、这一段获得主机名字,IP地址等的代码====================================== =========unit hostName;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, Winsock;typeTForm1 = class(TForm)Edit1: TEdit;Label1: TLabel;Label2: TLabel;Edit2: TEdit;Edit3: TEdit;Label3: TLabel;Button1: TButton;procedure Button1Click(Sender: TObject); private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject); varIp:string;Ipstr:string;Buffer:Array[1..32] of char;i:integer;WSData:TWSAdata;Host:PHostEnt;beginif WSAstartup(2,WSData)<>0 thenShowMessage('WS2_32.DLL初始化失败!'); halt;end;tryif GetHostName(@Buffer[1],32)<>0 then beginShowMessage('没有得到主机名!');halt;end;exceptShowMessage('没有成功返回主机名'); halt;end;Host := GetHostByName(@Buffer[1]);if Host = nil thenbeginShowMessage('IP地址为空');halt;endelsebeginEdit2.Text := Host.h_name;Edit3.Text := Chr(Host.h_addrtype+64); for i:=1 to 4 dobeginIp:=IntT oStr(Ord(Host.h_addr^[i-1])); ShowMessage('分段IP地址为:'+Ip);if i<4 thenIpstr := Ipstr + Ip + '.'Edit1.Text:=Ipstr+Ip; end;end; WSACleanup; end;end.。
如何查看自己的MAC地址
如何查看自己的MAC地址在计算机网络中,MAC地址(Media Access Control Address)是一个唯一的硬件地址,用于标识网络设备,如计算机、手机、路由器等。
MAC地址由48位二进制数表示(通常用十六进制表示),是网络通信中的基本要素之一、下面将介绍一些常见的方法来查看自己的MAC地址。
1. Windows操作系统:-第一种方法是通过命令提示符来查看。
- 打开命令提示符。
可以通过以下方式快速打开:在键盘上按下Win 键+R键,输入cmd,点击确定。
- 输入 ipconfig /all 并按下回车键。
你将看到关于网络适配器的详细信息,包括MAC地址。
-在结果中,查找“物理地址”或“物理地址(MAC)”,其后即为你的MAC地址。
-第二种方法是通过控制面板来查看。
-打开控制面板。
可以通过以下方式快速打开:点击开始菜单,输入“控制面板”,然后点击打开。
- 在控制面板中,选择“网络和Internet”。
-然后选择“网络和共享中心”。
-在左侧的菜单中,点击“更改适配器设置”。
-右键点击你正在使用的网络适配器,然后选择“状态”,再点击“详细信息”。
-在弹出的窗口中,会显示适配器的详细信息,包括MAC地址。
2. macOS操作系统:-在顶部菜单栏中,点击“苹果”图标,然后选择“系统偏好设置”。
-在系统偏好设置窗口中,选择“网络”。
-在网络设置窗口中,选择左侧的网络连接,比如Wi-Fi或以太网。
-然后点击右下角的“高级”按钮。
3. Linux操作系统:- 打开终端窗口。
可以通过按下Ctrl+Alt+T快捷键来打开。
- 在终端中,输入 ifconfig 并按下回车键。
-你将看到有关网络适配器的详细信息,包括MAC地址。
4. Android操作系统:-打开“设置”应用程序。
-在设置中,选择“关于手机”或“关于设备”。
-在关于手机(或设备)页面中,选择“状态”或“硬件信息”。
-在状态(或硬件信息)页面中,查找“Wi-FiMAC地址”或“以太网MAC地址”项,这将显示你的MAC地址。
如何查看计算机的MAC地址
如何查看计算机的MAC地址MAC地址(Media Access Control Address)是用于网络设备识别和通信的唯一地址。
每个网络接口设备都有一个独特的MAC地址,它由六个十六进制数(00-FF)组成,通常以冒号(:)或短划线(-)分隔。
在计算机系统中,有几种方法可以查看MAC地址。
下面将介绍不同操作系统中的方法。
Windows系统中查看MAC地址的方法:1. 使用命令提示符:按下Win + R,输入cmd并按下Enter键,打开命令提示符窗口。
在命令提示符中输入“ipconfig /all”,然后按下Enter键。
在输出结果中,查找“以太网适配器”或“无线局域网适配器”部分,找到对应的接口名称,紧随其后的就是对应的MAC地址。
2.在网卡属性中查看:右键单击任务栏上的网络连接图标,选择“打开网络和共享中心”。
在新窗口中,点击当前网络连接名称的链接。
在弹出的对话框中,点击“详细信息”按钮,即可在“物理地址”一栏查看MAC地址。
3. 使用设备管理器:按下Win + X,选择“设备管理器”。
展开“网络适配器”节点,找到你想查看MAC地址的网络接口设备,右键单击,选择“属性”。
在“属性”窗口中,切换到“高级”选项卡,在“网络地址”或““Locally Administered Address”一栏可以看到MAC地址。
MacOS系统中查看MAC地址的方法:1.通过系统偏好设置:点击屏幕左上角的苹果图标,选择“系统偏好设置”,然后点击“网络”。
选择想要查看MAC地址的网络接口(例如Wi-Fi或以太网),在右侧的信息栏中可以看到“硬件地址”或“MAC地址”。
2. 使用终端命令:点击“Launchpad”,并打开“终端”。
在终端中输入“ifconfig”,按下Enter键。
在输出结果中,找到你要查看的网络接口(例如en0或en1),在该行中可以找到MAC地址。
Linux系统中查看MAC地址的方法:1. 通过ifconfig命令:打开终端,输入“ifconfig”,按下Enter 键。
获得MAC地址的四个方法
获得MAC地址的四个方法1.使用WMI。
查询表Win32_NetworkAdapterConfiguration即可获得。
2.使用ARP协议。
请看这里。
3.使用Windows命令nbtstat,也就是通过NetBIOS。
请看这里。
4.查询SNMP(就是一种用于监视网络设备的协议)的MIB(管理信息数据库)。
但这不是一件简单的事情,需要自己创建SNMP包,发送到交换机,然后对返回的响应进行解析。
下面是代碼:using System;using System.Diagnostics;using System.Management;using ;using System.Runtime.InteropServices;using System.Text.RegularExpressions;namespace MACAddress{///<summary>/// MainClass 的摘要描述。
///</summary>internal class MainClass{///<summary>///應用程式的主進入點。
///</summary>[STAThread]private static void Main(string[] args){GetMACByWMI();IPAddress[] ips = GetLocalIP();foreach (IPAddress ip in ips){Console.WriteLine(GetMacByARP(ip.ToString()));string mac = GetRemoteMacByNetBIOS(ip.ToString());if ( mac.Length != 0 )Console.WriteLine(mac);elseConsole.WriteLine("Fail to get MACAddress by NetBIOS");GetMACBySNMP(ip.ToString(),"yourGroupName@yourVlanNumber");}Console.ReadLine();}By WMI#region By ARP[DllImport("Iphlpapi.dll")]private static extern int SendARP(Int32 dest, Int32 host, ref Int64 mac, re f Int32 length);[DllImport("Ws2_32.dll")]private static extern Int32 inet_addr(string ip);public static string GetMacByARP(string clientIP){string ip = clientIP;Int32 ldest = inet_addr(ip);Int64 macinfo = new Int64();Int32 len = 6;try{SendARP(ldest, 0, ref macinfo, ref len);}catch{return "";}string originalMACAddress = Convert.ToString(macinfo, 16);if (originalMACAddress.Length < 12){originalMACAddress = originalMACAddress.PadLeft(12, '0');}string macAddress;if (originalMACAddress != "0000" && originalMACAddress.Length == 12){string mac1, mac2, mac3, mac4, mac5, mac6;mac1 = originalMACAddress.Substring(10, 2);mac2 = originalMACAddress.Substring(8, 2);mac3 = originalMACAddress.Substring(6, 2);mac4 = originalMACAddress.Substring(4, 2);mac5 = originalMACAddress.Substring(2, 2);mac6 = originalMACAddress.Substring(0, 2);macAddress = mac1 + "-" + mac2 + "-" + mac3 + "-" + mac4 + "-" + mac5 + "-" + mac6;}else{macAddress = "";}return macAddress.ToUpper();}public static IPAddress[] GetLocalIP(){string hostName = Dns.GetHostName();IPHostEntry ipEntry = Dns.GetHostByName(hostName);return ipEntry.AddressList;}#endregion#region By NetBIOSpublic static string GetRemoteMacByNetBIOS(string clientIP){string ip = clientIP;string dirResults = "";ProcessStartInfo psi = new ProcessStartInfo();Process proc = new Process();psi.FileName = "nbtstat.exe";//psi.RedirectStandardInput = false;psi.RedirectStandardOutput = true;psi.RedirectStandardError = true;psi.Arguments = "-A " + ip;eShellExecute = false;proc = Process.Start(psi);dirResults = proc.StandardOutput.ReadToEnd();string error = proc.StandardError.ReadToEnd();proc.WaitForExit();dirResults = dirResults.Replace("\r", "").Replace("\n", "").Replace("\t ", "");Regex reg = new Regex("Mac[ ]{0,}Address[ ]{0,}=[ ]{0,}(?((.)*?))__ MAC", RegexOptions.IgnoreCase | piled);Match mc = reg.Match(dirResults + "__MAC");if (mc.Success){return mc.Groups["key"].Value.ToUpper();}else{return "";}}#endregion#region By SNMPpublic static void GetMACBySNMP(string ip,string vlan){int commLength,mibLength,dataStart,dataLength;string nextMib,value;SNMP conn = new SNMP();string mib = "1.3.6.1.2.1.17.4.3.1.1";int orgMibLength = mib.Length;byte[] response = new byte[1024];nextMib = mib;while ( true){response = conn.Get("getnext",ip,vlan,nextMib);commLength = Convert.ToInt16(response[6]);mibLength = Convert.ToInt16(response[23+commLength]);dataLength = Convert.ToInt16(response[25+commLength+mibLengt h]);dataStart = 26 + commLength + mibLength;value = BitConverter.ToString(response,dataStart,dataLength);nextMib = conn.GetNextMIB(response);if ( !(nextMib.Substring(0,orgMibLength) == mib)){break;}Console.WriteLine("{0}={1}",nextMib,value);}}#endregion}}SNMP Classusing System;using ;using .Sockets;using System.Text;namespace MACAddress{/**////<summary>/// SNMP 的摘要描述。
获取mac地址的几种方法
获取mac地址的⼏种⽅法⽅法⼀:通过NetBIOS[Netbios is not supported on Windows Vista, Windows Server 2008, and subsequent versions of the operating system] #include#pragma comment(lib, "Netapi32.lib")namespace{bool GetAdapterInfo(int adapterNum, std::string& macOUT){NCB Ncb;memset(&Ncb, 0, sizeof(Ncb));Ncb.ncb_command = NCBRESET; // 重置⽹卡,以便我们可以查询Ncb.ncb_lana_num = adapterNum;if (Netbios(&Ncb) != NRC_GOODRET)return false;// 准备取得接⼝卡的状态块memset(&Ncb, sizeof(Ncb), 0);Ncb.ncb_command = NCBASTAT;Ncb.ncb_lana_num = adapterNum;strcpy((char *) Ncb.ncb_callname, "*");struct ASTAT{ADAPTER_STATUS adapt;NAME_BUFFER nameBuff[30];}adapter;memset(&adapter,sizeof(adapter), 0);Ncb.ncb_buffer = (unsigned char *)&adapter;Ncb.ncb_length = sizeof(adapter);if (Netbios(&Ncb) != 0)return false;char acMAC[32];sprintf(acMAC, "%02X-%02X-%02X-%02X-%02X-%02X",int (adapter.adapt.adapter_address[0]),int (adapter.adapt.adapter_address[1]),int (adapter.adapt.adapter_address[2]),int (adapter.adapt.adapter_address[3]),int (adapter.adapt.adapter_address[4]),int (adapter.adapt.adapter_address[5]));macOUT = acMAC;return true;}}bool GetMacByNetBIOS(std::string& macOUT){// 取得⽹卡列表LANA_ENUM adapterList;NCB Ncb;memset(&Ncb, 0, sizeof(NCB));Ncb.ncb_command = NCBENUM;Ncb.ncb_buffer = (unsigned char *)&adapterList;Ncb.ncb_length = sizeof(adapterList);Netbios(&Ncb);// 取得MACfor (int i = 0; i < adapterList.length; ++i){if (GetAdapterInfo(/doc/ef0e8e59915f804d2a16c13b.html na[i], macOUT)) return true;}return false;}参考:取得系统中⽹卡MAC地址的三种⽅法⽅法⼆:通过对控制台ipconfig /all命令重定向#include#includenamespace{#if 0/// @brief 采⽤字符串查找来提取MAC地址/// @remark 该⽅法有很⼤局限性,并不是所有OS返回的MAC地址前导字符串都是/// "Physical Address. . . . . . . . . : "bool ParseMac(const std::string& str, std::string& macOUT){static const std::string beginMarkOfMAC("Physical Address. . . . . . . . . : ");static const std::string endMarkOfMAC("\r\n");size_t begin = str.find(beginMarkOfMAC);if(begin != std::string::npos){begin += beginMarkOfMAC.size();size_t end = str.find(endMarkOfMAC, begin);if(end != std::string::npos){macOUT = str.substr(begin, end - begin - 1);return true;}}return false;}#else/// @brief 采⽤boost::regex来提取MACbool ParseMac(const std::string& str, std::string& macOUT){const static boost::regex expression("([0-9a-fA-F]{2})-([0-9a-fA-F]{2})-([0-9a-fA-F]{2})-([0-9a-fA-F]{2})-([0-9a-fA-F]{2})-([0-9a-f A-F]{2})", boost::regex::perl | boost::regex::icase);boost::cmatch what;if(boost::regex_search(str.c_str(), what, expression)){macOUT = what[1] + "-" + what[2] + "-" + what[3] + "-" + what[4] + "-" + what[5] + "-" +what[6];return true;}return false;}#endif}bool GetMacByCmd(std::string& macOUT){bool ret = false;//初始化返回MAC地址缓冲区SECURITY_ATTRIBUTES sa;sa.nLength = sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDescriptor = NULL;sa.bInheritHandle = TRUE;//创建管道HANDLE hReadPipe,hWritePipe;if(CreatePipe(&hReadPipe, &hWritePipe, &sa, 0) == TRUE){//控制命令⾏窗⼝信息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;//创建获取命令⾏进程if (CreateProcess(NULL, "ipconfig /all", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi) == TRUE){WaitForSingleObject(pi.hProcess, 3000); // 设置超时时间,防⽌Vista、Win7等操作系统卡死unsigned long count; CloseHandle(hWritePipe);std::string strBuffer(1024 * 10, '\0'); // 准备⾜够⼤的缓冲区if(ReadFile(hReadPipe, const_cast(strBuffer.data()), strBuffer.size() - 1, &count, 0) == TRUE){strBuffer.resize(strBuffer.find_first_of('\0')); // 截掉缓冲区后⾯多余的'\0'ret = ParseMac(strBuffer, macOUT);//提取MAC地址串}CloseHandle(pi.hThread);CloseHandle(pi.hProcess);}CloseHandle(hWritePipe); // VS2010下调试,此处会有“An invalid handle was specified”的中断,直接运⾏正常,原因未知。
获取远程主机MAC地址的新思路及实现
获取远程主机MAC地址的新思路及实现摘要:本文分析了利用SendARP方法(基于ARP协议)来获取远程主机MAC地址的缺陷,提出了一种新思路——研究并利用NetBIOS Name Service来快速获取远程主机MAC地址的方法,并给出了其在Borland Delphi6中的程序。
关键词:MAC地址,远程主机,NetBIOS,TNMUDP引言众所周知,在所有网卡信息中,最重要的莫过于网卡的MAC地址,即网卡的物理地址。
MAC地址固化在网卡的ROM中,一般不易改动。
因此在网络中需要监控一台计算机的最好的方法就是获取它的MAC地址。
那么,如何获取远程主机(Remote Host,即和本地主机不在同一个子网中的主机)的MAC地址呢?一般的资料认为:采用IpHelperAPI的SendARP方法,但根据笔者的实验观察,此种方法行不通——它只能获取“本网段”内主机的MAC地址,如果源主机与目的主机不在同一个网段内,则该方法就只能获取“网关”的MAC地址,而无法获取目的主机的MAC地址。
这是由ARP协议的工作原理决定的。
获取远程主机MAC地址的原理及分析下面是利用NetBIOS协议来获取“远程主机(Remote host)”MAC地址的思路和实现方法。
大家都知道,NetBIOS(网络基本输入/输出系统)是一套用于网络通讯的调用接口,包含了NetBIOS Name和MAC地址等信息。
NetBIOS并没有对下层使用的协议进行限制,因此它除了可以在NetBEUI支持下运行之外,还可以在其他协议支持下运行。
其中NetBIOS Over IP由于使用TCP/IP协议,使远程主机之间的NetBIOS通信得以较好实现。
在NetBIOS Over IP通信过程中,可假定源主机A向远程目的主机B请求其“NetBIOS Names”信息。
则两者之间的通信过程如下所示:首先,主机A向主机B发送“UDP-NetBIOS-NS”询问包,即向主机B的137端口,发Query包来询问主机B的NetBIOS Names信息。
DELPHI7.0获取硬盘、CPU、网卡序列号-XpFoxsBlog
DELPHI7.0获取硬盘、CPU 、网卡序列号-XpFoxsBlog001 //引用及TYPE 变量申明002003 uses004 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,005 Dialogs, StdCtrls,nb30; {重要引用}006007 type008 PASTAT = ^TASTAT;009 TASTAT = record010 adapter : TAdapterStatus;011 name_buf : TNameBuffer;012 end;013014 TForm1 = class(TForm)015 Button1: TButton;016 Edit1: TEdit;017 Label1: TLabel;018 Label2: TLabel;019 Label3: TLabel;020 Edit2: TEdit;021 Edit3: TEdit;022 Button2: TButton;023 Edit4: TEdit;024 Label4: TLabel;025 procedure Button1Click(Sender: TObject);026 procedure Button2Click(Sender: TObject);027 private028 { Private declarations }029 public030 { Public declarations }032033 var034 Form1: TForm1;035036 implementation037038 {$R *.dfm}039 type040 TCPUID = array[1..4] of Longint;041042 //取硬盘系列号:043 function GetIdeSerialNumber: pchar; //获取硬盘的出厂系列号;044 const IDENTIFY_BUFFER_SIZE = 512;045 type046 TIDERegs = packed record047 bFeaturesReg: BYTE;048 bSectorCountReg: BYTE;049 bSectorNumberReg: BYTE;050 bCylLowReg: BYTE;051 bCylHighReg: BYTE;052 bDriveHeadReg: BYTE;053 bCommandReg: BYTE;054 bReserved: BYTE;055 end;056057 TSendCmdInParams = packed record058 cBufferSize: DWORD;059 irDriveRegs: TIDERegs;060 bDriveNumber: BYTE;061 bReserved: array[0..2] of Byte;062 dwReserved: array[0..3] of DWORD;063 bBuffer: array[0..0] of Byte;064 end;066 TIdSector = packed record067 wGenConfig: Word;068 wNumCyls: Word;069 wReserved: Word;070 wNumHeads: Word;071 wBytesPerTrack: Word;072 wBytesPerSector: Word;073 wSectorsPerTrack: Word;074 wVendorUnique: array[0..2] of Word; 075 sSerialNumber: array[0..19] of CHAR; 076 wBufferType: Word;077 wBufferSize: Word;078 wECCSize: Word;079 sFirmwareRev: array[0..7] of Char; 080 sModelNumber: array[0..39] of Char; 081 wMoreVendorUnique: Word;082 wDoubleWordIO: Word;083 wCapabilities: Word;084 wReserved1: Word;085 wPIOTiming: Word;086 wDMATiming: Word;087 wBS: Word;088 wNumCurrentCyls: Word;089 wNumCurrentHeads: Word;090 wNumCurrentSectorsPerTrack: Word; 091 ulCurrentSectorCapacity: DWORD;092 wMultSectorStuff: Word;093 ulTotalAddressableSectors: DWORD; 094 wSingleWordDMA: Word;095 wMultiWordDMA: Word;096 bReserved: array[0..127] of BYTE; 097 end;098099 PIdSector = ^TIdSector;100 TDriverStatus = packed record101 bDriverError: Byte;102 bIDEStatus: Byte;103 bReserved: array[0..1] of Byte;104 dwReserved: array[0..1] of DWORD;105 end;106107 TSendCmdOutParams = packed record108 cBufferSize: DWORD;109 DriverStatus: TDriverStatus;110 bBuffer: array[0..0] of BYTE;111 end;112 var113 hDevice: Thandle;114 cbBytesReturned: DWORD;115 SCIP: TSendCmdInParams;116 aIdOutCmd: array[0..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE-1)-1] of Byte;117 IdOutCmd: TSendCmdOutParams absolute aIdOutCmd;118119 procedure ChangeByteOrder(var Data; Size: Integer);//函数中的过程 120 var121 ptr: Pchar;122 i: Integer;123 c: Char;124 begin125 ptr := @Data;126 for I := 0 to (Size shr 1) - 1 do begin127 c := ptr^;128 ptr^ := (ptr + 1)^;129 (ptr + 1)^ := c;130 Inc(ptr, 2);131 end;132 end;133134 begin //函数主体135 Result := '';136 if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then 137 begin // Windows NT, Windows 2000138 hDevice := CreateFile('\\.\PhysicalDrive0',GENERIC_READ or GENERIC_WRITE,139 FILE_SHARE_READ or FILE_SHARE_WRITE, nil,OPEN_EXISTING, 0, 0);140 end141 else // Version Windows 95 OSR2, Windows 98142 hDevice := CreateFile('\\.\SMARTVSD', 0, 0, nil,Create_NEW, 0, 0);143 if hDevice = INVALID_HANDLE_VALUE then Exit;144 try145 FillChar(SCIP, SizeOf(TSendCmdInParams) - 1, #0); 146 FillChar(aIdOutCmd, SizeOf(aIdOutCmd), #0);147 cbBytesReturned := 0;148 with SCIP do149 begin150 cBufferSize := IDENTIFY_BUFFER_SIZE;151 with irDriveRegs do152 begin153 bSectorCountReg := 1;154 bSectorNumberReg := 1;155 bDriveHeadReg := $A0;156 bCommandReg := $EC;157 end;158 end;159 if not DeviceIoControl(hDevice, $0007C088, @SCIP,SizeOf(TSendCmdInParams) - 1,@aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil) then Exit;160 finally161 CloseHandle(hDevice);162 end;163 with PIdSector(@IdOutCmd.bBuffer)^ do 164 begin165 ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber));166 (Pchar(@sSerialNumber) + SizeOf(sSerialNumber))^:=#0;167 Result := Pchar(@sSerialNumber); 168 end;169 end;17 0 //=============================================================== ==171172 //CPU系列号:173 FUNCTION GetCPUID : TCPUID; assembler; register;174 asm175 PUSH EBX {Save affected register} 176 PUSH EDI177 MOV EDI,EAX {@Resukt}178 MOV EAX,1179 DW $A20F {CPUID Command}180 STOSD {CPUID[1]}181 MOV EAX,EBX182 STOSD {CPUID[2]}183 MOV EAX,ECX184 STOSD {CPUID[3]}185 MOV EAX,EDX186 STOSD {CPUID[4]}187 POP EDI {Restore registers}188 POP EBX189 END;190191 function GetCPUIDStr:String;192 var193 CPUID:TCPUID;194 begin195 CPUID:=GetCPUID;19 6 Result:=IntToHex(CPUID[1],8)+IntToHex(CPUID[2],8)+IntToHex(CPUID[ 3],8)+IntToHex(CPUID[4],8);197 end; 19819 9 ///============================================================== ====================200201 ///取MAC(非集成网卡):202203 function NBGetAdapterAddress(a: Integer): string;204 var205 NCB: TNCB; // Netbios control block //NetBios控制块206 ADAPTER: TADAPTERSTATUS; // Netbios adapter status//取网卡状态207 LANAENUM: TLANAENUM; // Netbios lana208 intIdx: Integer; // Temporary work value//临时变量209 cRC: Char; // Netbios return code//NetBios返回值210 strTemp: string; // Temporary string//临时变量211 begin212 // Initialize213 Result := '';214 try215 // Zero control blocl216 ZeroMemory(@NCB, SizeOf(NCB));217 // Issue enum command218 NCB.ncb_command := Chr(NCBENUM);219 cRC := NetBios(@NCB);220 // Reissue enum command221 NCB.ncb_buffer := @LANAENUM;222 NCB.ncb_length := SizeOf(LANAENUM);223 cRC := NetBios(@NCB);224 if ord(cRC) <> 0 then225 exit;226 // Reset adapter227 ZeroMemory(@NCB, SizeOf(NCB));228 NCB.ncb_command := Chr(NCBRESET);229 NCB.ncb_lana_num := na[a]; 230 cRC := NetBios(@NCB);231 if ord(cRC) <> 0 then232 exit;233 // Get adapter address234 ZeroMemory(@NCB, SizeOf(NCB));235 NCB.ncb_command := Chr(NCBASTAT);236 NCB.ncb_lana_num := na[a]; 237 StrPCopy(NCB.ncb_callname, '*');238 NCB.ncb_buffer := @ADAPTER;239 NCB.ncb_length := SizeOf(ADAPTER); 240 cRC := NetBios(@NCB);241 // Convert it to string242 strTemp := '';243 for intIdx := 0 to 5 do244 strTemp := strTemp +InttoHex(Integer(ADAPTER.adapter_address[intIdx]), 2); 245 Result := strTemp;246 finally247 end;248 end;24 9 //=============================================================== ===========250 //取MAC地址(集成网卡和非集成网卡): 251252 function Getmac:string;253 var254 ncb : TNCB;255 s:string;256 adapt : TASTAT;257 lanaEnum : TLanaEnum;258 i, j, m : integer;259 strPart, strMac : string;260 begin261 FillChar(ncb, SizeOf(TNCB), 0);262 ncb.ncb_command := Char(NCBEnum);263 ncb.ncb_buffer := PChar(@lanaEnum);264 ncb.ncb_length := SizeOf(TLanaEnum);265 s:=Netbios(@ncb);266 for i := 0 to integer(lanaEnum.length)-1 do267 begin268 FillChar(ncb, SizeOf(TNCB), 0);269 ncb.ncb_command := Char(NCBReset);270 ncb.ncb_lana_num := na[i];271 Netbios(@ncb);272 Netbios(@ncb);273 FillChar(ncb, SizeOf(TNCB), 0);274 ncb.ncb_command := Chr(NCBAstat);275 ncb.ncb_lana_num := na[i];276 ncb.ncb_callname := '* '; 277 ncb.ncb_buffer := PChar(@adapt);278 ncb.ncb_length := SizeOf(TASTAT);279 m:=0;280 if (Win32Platform = VER_PLATFORM_WIN32_NT) then281 m:=1;282 if m=1 then283 begin284 if Netbios(@ncb) = Chr(0) then285 strMac := '';286 for j := 0 to 5 do287 begin288 strPart :=IntToHex(integer(adapt.adapter.adapter_address[j]), 2); 289 strMac := strMac + strPart + '-';290 end;291 SetLength(strMac, Length(strMac)-1);292 end;293 if m=0 then294 if Netbios(@ncb) <> Chr(0) then295 begin296 strMac := '';297 for j := 0 to 5 do 298 begin299 strPart :=IntToHex(integer(adapt.adapter.adapter_address[j]), 2);300 strMac := strMac + strPart + '-';301 end;302 SetLength(strMac, Length(strMac)-1);303 end;304 end;305 result:=strmac;306 end;307308 function PartitionString(StrV,PrtSymbol: string): TStringList; 309 var310 iTemp: integer;311 begin312 result := TStringList.Create;313 iTemp := pos(PrtSymbol,StrV);314 while iTemp>0 do begin315 if iTemp>1 then result.Append(copy(StrV,1,iTemp-1)); 316 delete(StrV,1,iTemp+length(PrtSymbol)-1);317 iTemp := pos(PrtSymbol,StrV);318 end;319 if Strv<>'' then result.Append(StrV);320 end;321322 function MacStr():String;323 var324 Str:TStrings;325 i:Integer;326 MacStr:String;327 begin328 MacStr:='';329 Str:=TStringList.Create;330 Str:=PartitionString(Getmac,'-');331 for i:=0 to Str.Count-1 do332 MacStr:=MacStr+Str[i];333 Result:=MacStr;334 end;335336 //============================================== 337338339 //调用示例340 procedure TForm1.Button1Click(Sender: TObject); 341 begin342 Edit3.Text:=strpas(GetIdeSerialNumber);//取硬盘号343 Edit2.text:=GetCPUIDStr;//CPU系列号344 edit4.Text:=NBGetAdapterAddress(12);//非集成网卡345 Edit1.text:=MacStr;//集成和非集成网卡346347 end;Loading...。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DT := DT-((TZ.Bias+TZ.StandardBias) / (24*60));
Result := DateTimeToStr(DT)+' '+WideCharToString(TZ.StandardName);
mymaclength:=length(mymac);
r:=sendarp(myip,0,@mymac,@mymaclength);
label1.caption:='errorcode:'+inttostr(r);
label2.caption:=format('%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x',[mymac[0],mymac[1],mymac[2],mymac[3],mymac[4],mymac[5]]);
Var
AI,Work : PIPAdapterInfo;
Size : Integer;
Res : Integer;
I : Integer;
Function MACToStr(ByteArr : PByte; Len : Integer) : String;
Begin
Result := '';
End;
Function GetAddrString(Addr : PIPAddrString) : String;
Begin
Result := '';
While (Addr <> nil) do Begin
Result := Result+'A: '+Addr^.IPAddress+' M: '+Addr^.IPMask+#13;
End
Else Begin { daylight saving time }
DT := DT-((TZ.Bias+TZ.DaylightBias) / (24*60));
Result := DateTimeToStr(DT)+' '+WideCharToString(TZ.DaylightName);
AddressLength : Integer;
Address : Array[1..MAX_ADAPTER_ADDRESS_LENGTH] of Byte;
Index : Integer;
_Type : Integer;
DHCPEnabled : Integer;
CurrentIPAddress : PIPAddrString;
RaiseLastWin32Error;
End;
With Memo1,Lines do Begin
Work := AI;
I := 1;
Repeat
Add('');
Add('Adapter ' + IntToStr(I));
Add(' ComboIndex: '+IntToStr(Work^.ComboIndex));
MAX_HOSTNAME_LEN = 128; { from IPTYPES.H }
MAX_DOMAIN_NAME_LEN = 128;
MAX_SCOPE_ID_LEN = 256;
MAX_ADAPTER_NAME_LENGTH = 256;
MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
DT := UnixDateDelta+(TimeT / (24*60*60)); { in UTC }
{ calculate bias }
Res := GetTimeZoneInformation(TZ);
If (Res = TIME_ZONE_ID_INVALID) Then RaiseLastWin32Error;
Add(' Adapter name: '+Work^.AdapterName);
Add(' Description: '+Work^.Description);
Add(' Adapter address: '+MACToStr(@Work^.Address,Work^.AddressLength));
IPAddress : TIPAddressString;
IPMask : TIPAddressString;
Context : Integer;
End;
PFixedInfo = ^TFixedInfo;
TFixedInfo = Record { FIXED_INFO }
HostName : Array[0..MAX_HOSTNAME_LEN+3] of Char;
private
{ Private declarations }
procedure GetAdapterInformation;
public
{ Public declarations }
end;
var
Form1: TForm1;
Function sendarp(ipaddr:ulong;
IPAddressList : TIPAddrString;
GatewayList : TIPAddrString;
DHCPServer : TIPAddrString;
HaveWINS : Bool;
PrimaryWINSServer : TIPAddrString;
SecondaryWINSServer : TIPAddrString;
Add(' IP addresses: '+GetAddrString(@Work^.IPAddressList));
Add(' Gateways: '+GetAddrString(@Work^.GatewayList));
Add(' DHCP servers: '+GetAddrString(@Work^.DHCPServer));
delphi 获取MAC地址
1、通过IP取MAC地址
uses
WinSock;
Function sendarp(ipaddr:ulong;
temp:dword;
ulmacaddr:pointer;
ulmacaddrleng:pointer) : DWord; StdCall; External 'Iphlpapi.dll' Name 'SendARP';
Addr := Addr^.Next;
End;
End;
Function TimeTToDateTimeStr(TimeT : Integer) : String;
Const UnixDateDelta = 25569; { days between 12/31/1899 and 1/1/1970 }
procedure TForm1.Button1Click(Sender: TObject);
var
myip:ulong;
mymac:array[0..5] of byte;
myபைடு நூலகம்aclength:ulong;
r:integer;
begin
myip:=inet_addr(PChar('192.168.6.180'));
MAX_ADAPTER_ADDRESS_LENGTH = 8;
Type
TIPAddressString = Array[0..4*4-1] of Char;
PIPAddrString = ^TIPAddrString;
TIPAddrString = Record
Next : PIPAddrString;
LeaseObtained : Integer;
LeaseExpires : Integer;
End;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
Var
DT : TDateTime;
TZ : TTimeZoneInformation;
Res : DWord;
Begin
If (TimeT = 0) Then Result := ''
Else Begin
{ Unix TIME_T is secs since 1/1/1970 }
EnableRouting : Integer;
EnableProxy : Integer;
EnableDNS : Integer;
End;
PIPAdapterInfo = ^TIPAdapterInfo;
TIPAdapterInfo = Record { IP_ADAPTER_INFO }
temp:dword;
ulmacaddr:pointer;
ulmacaddrleng:pointer) : DWord; StdCall;
implementation