• Delphi 获取本机局域网IP地址 ,检测网络状态、类型、工作组、资源等


     Delphi 获取本机局域网IP地址 ,检测网络状态、类型、工作组、资源等

    unit NetFunc;
    
    interface
    
    uses
    SysUtils, Windows, dialogs, winsock, Classes, ComObj, WinInet, Variants;
    
    // 错误信息常量
    const
    C_Err_GetLocalIp = '获取本地ip失败';
    C_Err_GetNameByIpAddr = '获取主机名失败';
    C_Err_GetSQLServerList = '获取SQLServer服务器失败';
    C_Err_GetUserResource = '获取共享资失败';
    C_Err_GetGroupList = '获取所有工作组失败';
    C_Err_GetGroupUsers = '获取工作组中所有计算机失败';
    C_Err_GetNetList = '获取所有网络类型失败';
    C_Err_CheckNet = '网络不通';
    C_Err_CheckAttachNet = '未登入网络';
    C_Err_InternetConnected = '没有上网';
    
    C_Txt_CheckNetSuccess = '网络畅通';
    C_Txt_CheckAttachNetSuccess = '已登入网络';
    C_Txt_InternetConnected = '上网了';
    
    // 检测机器是否登入网络
    function IsLogonNet: Boolean;
    
    // 得到本机的局域网Ip地址
    function GetLocalIP(var LocalIp: string): Boolean;
    
    // 通过Ip返回机器名
    function GetNameByIPAddr(IPAddr: string; var MacName: string): Boolean;
    
    // 获取网络中SQLServer列表
    function GetSQLServerList(var List: Tstringlist): Boolean;
    
    // 获取网络中的所有网络类型
    function GetNetList(var List: Tstringlist): Boolean;
    
    // 获取网络中的工作组
    function GetGroupList(var List: Tstringlist): Boolean;
    
    // 获取工作组中所有计算机
    function GetUsers(GroupName: string; var List: Tstringlist): Boolean;
    
    // 获取网络中的资源
    function GetUserResource(IPAddr: string; var List: Tstringlist): Boolean;
    
    // 映射网络驱动器
    function NetAddConnection(NetPath: Pchar; PassWord: Pchar; LocalPath: Pchar)
    : Boolean;
    
    // 检测网络状态
    function CheckNet(IPAddr: string): Boolean;
    
    // 判断Ip协议有没有安装 这个函数有问题
    function IsIPInstalled: Boolean;
    
    // 检测机器是否上网
    function InternetConnected: Boolean;
    
    // 关闭网络连接
    function NetCloseAll: Boolean;
    
    /// //////////////////////////////////////////////////////////////////////////
    /// ////////////////////////////////////////////////////////////
    /// //////////////////////////////////////////////
    /// /////////// 代码实现部门////////////
    
    { =================================================================
    功 能: 检测机器是否登入网络
    参 数: 无
    返回值: 成功: True 失败: False
    备 注:
    版 本:
    1.0 2002/10/03 09:55:00
    ================================================================= }
    function IsLogonNet: Boolean;
    begin
    Result := False;
    if GetSystemMetrics(SM_NETWORK) <> 0 then
    Result := True;
    end;
    
    { =================================================================
    功 能: 返回本机的局域网Ip地址
    参 数: 无
    返回值: 成功: True, 并填充LocalIp 失败: False
    备 注:
    版 本:
    1.0 2002/10/02 21:05:00
    ================================================================= }
    function GetLocalIP(var LocalIp: string): Boolean;
    
    var
    HostEnt: PHostEnt;
    IP: String;
    Addr: Pchar;
    Buffer: array [0 .. 63] of Char;
    WSData: TWSADATA;
    begin
    Result := False;
    try
    WSAStartUp(2, WSData);
    GetHostName(Buffer, SizeOf(Buffer));
    // Buffer:='ZhiDa16';
    HostEnt := GetHostByName(Buffer);
    if HostEnt = nil then
    exit;
    Addr := HostEnt^.h_addr_list^;
    IP := Format('%d.%d.%d.%d', [Byte(Addr[0]), Byte(Addr[1]), Byte(Addr[2]),
    Byte(Addr[3])]);
    LocalIp := IP;
    Result := True;
    finally
    WSACleanup;
    end;
    end;
    
    { =================================================================
    功 能: 通过Ip返回机器名
    参 数:
    IpAddr: 想要得到名字的Ip
    返回值: 成功: 机器名 失败: ''
    备 注:
    inet_addr function converts a string containing an Internet
    Protocol dotted address into an in_addr.
    版 本:
    1.0 2002/10/02 22:09:00
    ================================================================= }
    function GetNameByIPAddr(IPAddr: String; var MacName: String): Boolean;
    
    var
    SockAddrIn: TSockAddrIn;
    HostEnt: PHostEnt;
    WSAData: TWSADATA;
    begin
    Result := False;
    if IPAddr = '' then
    exit;
    try
    WSAStartUp(2, WSAData);
    SockAddrIn.sin_addr.s_addr := inet_addr(Pchar(IPAddr));
    HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.s_addr, 4, AF_INET);
    if HostEnt <> nil then
    MacName := StrPas(HostEnt^.h_name);
    Result := True;
    finally
    WSACleanup;
    end;
    end;
    
    { =================================================================
    功 能: 返回网络中SQLServer列表
    参 数:
    List: 需要填充的List
    返回值: 成功: True,并填充List 失败 False
    备 注:
    版 本:
    1.0 2002/10/02 22:44:00
    ================================================================= }
    function GetSQLServerList(var List: Tstringlist): Boolean;
    
    var
    i: integer;
    // sRetValue: String;
    SQLServer: Variant;
    ServerList: Variant;
    begin
    // Result := False;
    List.Clear;
    try
    SQLServer := CreateOleObject('SQLDMO.Application');
    ServerList := SQLServer.ListAvailableSQLServers;
    for i := 1 to ServerList.Count do
    List.Add(ServerList.item(i));
    Result := True;
    Finally
    SQLServer := NULL;
    ServerList := NULL;
    end;
    end;
    
    { =================================================================
    功 能: 判断IP协议有没有安装
    参 数: 无
    返回值: 成功: True 失败: False;
    备 注: 该函数还有问题
    版 本:
    1.0 2002/10/02 21:05:00
    ================================================================= }
    function IsIPInstalled: Boolean;
    
    var
    WSData: TWSADATA;
    ProtoEnt: PProtoEnt;
    begin
    Result := True;
    try
    if WSAStartUp(2, WSData) = 0 then
    begin
    ProtoEnt := GetProtoByName('IP');
    if ProtoEnt = nil then
    Result := False
    end;
    finally
    WSACleanup;
    end;
    end;
    
    { =================================================================
    功 能: 返回网络中的共享资源
    参 数:
    IpAddr: 机器Ip
    List: 需要填充的List
    返回值: 成功: True,并填充List 失败: False;
    备 注:
    WNetOpenEnum function starts an enumeration of network
    resources or existing connections.
    WNetEnumResource function continues a network-resource
    enumeration started by the WNetOpenEnum function.
    版 本:
    1.0 2002/10/03 07:30:00
    ================================================================= }
    function GetUserResource(IPAddr: string; var List: Tstringlist): Boolean;
    
    type
    TNetResourceArray = ^TNetResource; // 网络类型的数组
    
    Var
    i: integer;
    Buf: Pointer;
    Temp: TNetResourceArray;
    lphEnum: THandle;
    NetResource: TNetResource;
    Count, BufSize, Res: DWord;
    Begin
    Result := False;
    List.Clear;
    if copy(IPAddr, 0, 2) <> '\' then
    IPAddr := '\' + IPAddr; // 填充Ip地址信息
    FillChar(NetResource, SizeOf(NetResource), 0); // 初始化网络层次信息
    NetResource.lpRemoteName := @IPAddr[1]; // 指定计算机名称
    // 获取指定计算机的网络资源句柄
    Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
    RESOURCEUSAGE_CONNECTABLE, @NetResource, lphEnum);
    Buf := nil;
    if Res <> NO_ERROR then
    exit; // 执行失败
    while True do // 列举指定工作组的网络资源
    begin
    Count := $FFFFFFFF; // 不限资源数目
    BufSize := 8192; // 缓冲区大小设置为8K
    GetMem(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 i := 0 to Count - 1 do
    begin
    // 获取指定计算机中的共享资源名称,+2表示删除"\",
    // 如\192.168.0.1 => 192.168.0.1
    List.Add(Temp^.lpRemoteName + 2);
    Inc(Temp);
    end;
    end;
    Res := WNetCloseEnum(lphEnum); // 关闭一次列举
    if Res <> NO_ERROR then
    exit; // 执行失败
    Result := True;
    FreeMem(Buf);
    End;
    
    { =================================================================
    功 能: 返回网络中的工作组
    参 数:
    List: 需要填充的List
    返回值: 成功: True,并填充List 失败: False;
    备 注:
    版 本:
    1.0 2002/10/03 08:00:00
    ================================================================= }
    function GetGroupList(var List: Tstringlist): Boolean;
    
    type
    TNetResourceArray = ^TNetResource; // 网络类型的数组
    
    Var
    NetResource: TNetResource;
    Buf: Pointer;
    Count, BufSize, Res: DWord;
    lphEnum: THandle;
    p: TNetResourceArray;
    i, j: SmallInt;
    NetworkTypeList: TList;
    Begin
    Result := 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; // 缓冲区大小设置为8K
    GetMem(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;
    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; // 缓冲区大小设置为8K
    GetMem(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;
    

      

    // 获取IP
    
    type
    
    TIPList=Array of String;
    
     
    
    function .getIP: TIPList;
    type
      TaPInAddr = array [0..10] of PInAddr;
      PaPInAddr = ^TaPInAddr;
    const
      BufferSize=64;
    var
      phe : PHostEnt;
      pptr : PaPInAddr;
      Buffer : PAnsiChar;
      I : Integer;
      GInitData : TWSADATA;
    begin
      WSAStartup($101, GInitData);
      getMem(Buffer,BufferSize);
      GetHostName(Buffer, BufferSize);
      phe :=GetHostByName(buffer);
      if phe = nil then Exit;
      pptr := PaPInAddr(Phe^.h_addr_list);
      I := 0;
      while pptr^[I] <> nil do begin
         Inc(I);
      end;
      setLength(result,I);
      for I := low(result) to high(result) do
        result[i]:=StrPas(inet_ntoa(pptr^[I]^));
      freeMem(Buffer);
      WSACleanup;
    end;
    //该函数的实现需要引用单元:winsock。
    

      

    //获取MAC
    
    //需要用到Iphlpapi.dll中的一个函数:SendARP,其声明如下,
    
    Function SendARP(DestIP:in_addr;
                      srcIP:in_addr;
                      pMacAddr:pointer;
                      PhyAddrLen:pointer):DWord; StdCall; External 'Iphlpapi.dll';
    
     
    
    function getMacAddr(var memo: TMemo): String;
    var
      ipList:TIPList;
      ipLong:LongInt;
      ipD,ipS:in_addr;
      Mac:Array[0..5]of Byte;
      MacLen:integer;
      Error:Integer;
      I:Integer;
      Line:String;
    begin
      ipList:=getIP;
      MacLen:=length(Mac);
      for I := low(ipList) to high(ipList) do
      begin
        ipLong:=inet_addr(PAnsiChar(AnsiString(ipList[I])));
        ipD.S_addr:=ipLong;
        ipS.S_addr:=0;
        Error:=SendARP(ipD,ipS,@Mac,@MacLen);
        Line:=ipList[i]+'>>'+
            format('%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x',
              [mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]]);
        memo.Lines.Add(Line);
        result:=result+Line+chr(13);
      end;
    end;
    

      

     更新时间:

  • 相关阅读:
    Elementary Methods in Number Theory Exercise 1.5.2
    Elementary methods in number theory exercise 1.5.1 暨 重启C++之路:列出1到210的所有素数
    Elementary Methods in Number Theory Exercise 1.5.5
    《Elementary Methods in Number Theory》勘误
    Elementary Methods in Number Theory Exercise 1.5.2
    Elementary Methods in Number Theory Exercise 1.5.5
    Linux_我理解的逻辑地址、线性地址、物理地址和虚拟地址(补充完整了)
    寄存器和常用汇编指令
    Linux_AMD体系结构学习(内存模型)
    计算机是如何启动的?
  • 原文地址:https://www.cnblogs.com/guorongtao/p/4473474.html
Copyright © 2020-2023  润新知