Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.01;
Скачать: CL | DM;

Вниз

ipconfig на Delphi   Найти похожие ветки 

 
psa247 ©   (2006-10-11 17:26) [0]

Код

uses SysUtils, Classes, Windows;

const
  MAX_ADAPTER_NAME_LENGTH = 256;
  MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
  MAX_ADAPTER_ADDRESS_LENGTH = 8;

  MAX_INTERFACE_NAME_LEN = 256;
  MAXLEN_PHYSADDR = 8;
  MAXLEN_IFDESCR = 256;
  MIB_IF_ADMIN_STATUS_UP = 1;
  MIB_IF_ADMIN_STATUS_DOWN = 2;

  OutBufLen : ULONG = 2000;

type
//------IP address structures---------------------------------------------------
  PIP_ADDRESS_STRING = ^IP_ADDRESS_STRING;
  IP_ADDRESS_STRING = array[0..15] of char; // IP as string

  PIP_ADDR_STRING = ^IP_ADDR_STRING;
  IP_ADDR_STRING = record
     Next : PIP_ADDR_STRING;
     IpAddress : IP_ADDRESS_STRING;
     IpMask : IP_ADDRESS_STRING;
     Context : DWORD;
     end;

//------ADAPTER INFO STRUCTURES-------------------------------------------------
  PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
  IP_ADAPTER_INFO = record
     Next : PIP_ADAPTER_INFO;
     ComboIndex : DWORD;
     AdapterName : array[1..MAX_ADAPTER_NAME_LENGTH + 4] of char;
     Description : array[1..MAX_ADAPTER_DESCRIPTION_LENGTH + 4] of char;
     AddressLength : UINT;
     Address : array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte;
     Index : DWORD;
     aType : UINT;
     DHCPEnabled : UINT;
     CurrentIPAddress : PIP_ADDR_STRING;
     IPAddressList : IP_ADDR_STRING;
     GatewayList : IP_ADDR_STRING;
     DHCPServer : IP_ADDR_STRING;
     HaveWINS : BOOL;
     PrimaryWINSServer : IP_ADDR_STRING;
     SecondaryWINSServer : IP_ADDR_STRING;
     LeaseObtained : LongInt;
     LeaseExpires : LongInt;
     SpareStuff : array[1..200] of char;
     end;

type
  PMIB_IFROW = ^MIB_IFROW;
  MIB_IFROW = record
     wszName : array[1..MAX_INTERFACE_NAME_LEN]of WCHAR;
     dwIndex : DWORD;
     dwType : DWORD;
     dwMtu : DWORD;
     dwSpeed : DWORD;
     dwPhysAddrLen : DWORD;
     bPhysAddr : array[1..MAXLEN_PHYSADDR]of BYTE;
     dwAdminStatus : DWORD ;
     dwOperStatus : DWORD;
     dwLastChange : DWORD;
     dwInOctets : DWORD;
     dwInUcastPkts : DWORD;
     dwInNUcastPkts : DWORD;
     dwInDiscards : DWORD;
     dwInErrors : DWORD;
     dwInUnknownProtos : DWORD;
     dwOutOctets : DWORD;
     dwOutUcastPkts : DWORD;
     dwOutNUcastPkts : DWORD;
     dwOutDiscards : DWORD;
     dwOutErrors : DWORD;
     dwOutQLen : DWORD;
     dwDescrLen : DWORD;
     bDescr : array[1..MAXLEN_IFDESCR]of BYTE;
     end;

function GetAdaptersInfo(pAdapterInfo : PIP_ADAPTER_INFO; pOutBufLen : PULONG): DWORD; stdcall;
                        external "Iphlpapi.dll" name "GetAdaptersInfo";

function GetIfEntry(pIfRow : PMIB_IFROW): DWORD; stdcall; external "Iphlpapi.dll" name "GetIfEntry";
function SetIfEntry(pIfRow : PMIB_IFROW): DWORD; stdcall; external "Iphlpapi.dll" name "SetIfEntry";

procedure ChangeStatus(Index: DWORD; Stat: DWORD);
function StatusAdapter(Index: DWORD): boolean;
procedure GetSpisokClick;

var IFROW: MIB_IFROW;


 
psa247 ©   (2006-10-11 17:26) [1]


implementation
uses Main;

procedure GetSpisokClick;
var S : string;
   k : UINT;
   dwResVol : DWORD;
   pAdapterInfo : PIP_ADAPTER_INFO;
   Next_tmp : PIP_ADDR_STRING;
begin
  Form1.Memo1.Lines.Add("Start");
  OutBufLen:= sizeof(IP_Adapter_Info);
  pAdapterInfo:= AllocMem(OutBufLen);
  dwResVol:= GetAdaptersInfo(pAdapterInfo, @OutBufLen);
  if (dwResVol = ERROR_INSUFFICIENT_BUFFER)or(dwResVol = ERROR_BUFFER_OVERFLOW)then begin
     FreeMem(pAdapterInfo);
     pAdapterInfo:= AllocMem(OutBufLen);
     dwResVol:= GetAdaptersInfo(pAdapterInfo, @OutBufLen);
     end;

  if dwResVol = NO_ERROR then begin
     repeat
        Form1.Memo1.Lines.Add("");
        S:= pAdapterInfo.Description;
        Form1.Memo1.Lines.Add("Ethernet Adapter: ");
        Form1.Memo1.Lines.Add(copy(S,1,pos(#0,S)-1));
        S:= "";
        for k:= 1 to pAdapterInfo.AddressLength do begin
           S:= S+(IntToHex(pAdapterInfo.Address[k], 2));
           if k <> pAdapterInfo.AddressLength then S:= S+"-";
           end;
        Form1.Memo1.Lines.Add("MAC Address: "+ S);
        Form1.Memo1.Lines.Add("IP Address: "+ pAdapterInfo.IPAddressList.IpAddress);
        S:= pAdapterInfo.AdapterName;
        Form1.Memo1.Lines.Add("GUID: "+ copy(S,1,pos(#0,S)-1));
        if StatusAdapter(pAdapterInfo.Index)then S:= "Active"
        else S:= "Disable";
        Form1.Memo1.Lines.Add("Status: "+ S);
        // DHCP
        if pAdapterInfo.DHCPEnabled =1 then S:= "Enabled"
        else S:= "Disable";
        Form1.Memo1.Lines.Add("DHCP: "+ S);

        Form1.Memo1.Lines.Add("GatewayList: ");
        Next_tmp:= @pAdapterInfo.GatewayList;
        with Next_tmp^ do begin
           while True do begin
              Form1.Memo1.Lines.Add(Next_tmp.IpAddress);
              if Next_tmp.Next = nil then break;
              Next_tmp:= pAdapterInfo.GatewayList.Next;
              end;
           end;
        Form1.Memo1.Lines.Add("DHCP Servers:");
        Next_tmp:= @pAdapterInfo.DHCPServer;
        with Next_tmp^ do begin
           while True do begin
              Form1.Memo1.Lines.Add(Next_tmp.IpAddress);
              Form1.Memo1.Lines.Add(Next_tmp.IpMask);
              if Next_tmp.Next = nil then break;
              Next_tmp:= pAdapterInfo.DHCPServer.Next;
              end;
           end;

        if pAdapterInfo.HaveWINS then begin
          Form1.Memo1.Lines.Add("Primary WINS Server:");
          Next_tmp:= @pAdapterInfo.PrimaryWINSServer;
          with Next_tmp^ do begin
             while True do begin
                Form1.Memo1.Lines.Add(Next_tmp.IpAddress);
                if Next_tmp.Next = nil then break;
                Next_tmp:= pAdapterInfo.PrimaryWINSServer.Next;
                end;
             end;
          Form1.Memo1.Lines.Add("Secondary WINS Server:");
          Next_tmp:= @pAdapterInfo.SecondaryWINSServer;
          with Next_tmp^ do begin
             while True do begin
                Form1.Memo1.Lines.Add(Next_tmp.IpAddress);
                if Next_tmp.Next = nil then break;
                Next_tmp:= pAdapterInfo.SecondaryWINSServer.Next;
                end;
             end;
          end
        else Form1.Memo1.Lines.Add("Have WINS: No");
        //      LeaseObtained : LongInt;
        Form1.Memo1.Lines.Add("LeaseObtained: __:__:__");
        Form1.Memo1.Lines.Add("LeaseExpires: __:__:__");

        pAdapterInfo:= pAdapterInfo.Next;
        Form1.Memo1.Lines.Add("-----------------------------");
     until pAdapterInfo = nil;
     end
  else Form1.Memo1.Lines.Add("Ethernet Adapters not found");
  FreeMem(pAdapterInfo);
end;

function StatusAdapter(Index: DWORD): boolean;
begin
  ifrow.dwIndex:= Index;
  Result:= false;
  if GetIfEntry(@IFROW)= NO_ERROR then
    if ifrow.dwAdminStatus = MIB_IF_ADMIN_STATUS_UP then Result:= True;
end;

procedure ChangeStatus(Index: DWORD; Stat: DWORD);
begin
  ifrow.dwIndex:= Index;
  if GetIfEntry(@IFROW)= NO_ERROR then begin
     ifrow.dwAdminStatus:= Stat;
     SetIfEntry(@IFROW);
     end;
end;


У меня несколько вопросов:
1) как определить defaultgateway
2) как определить autoconfiguration (да/нет)
3) узнать DNS-суффикс
4) DNS - сервера
5) Маску подсети
6) IP-routing
7) NodeType

?


 
psa247 ©   (2006-10-11 17:28) [2]

и еще: как "перегнать"
LeaseObtained : LongInt;

в дату ?


 
Rouse_ ©   (2006-10-11 20:55) [3]

Эээ... оно? http://rouse.drkb.ru/files/netifenum.zip


 
psa247 ©   (2006-10-14 10:19) [4]

Осталось:

1) как определить autoconfiguration (да/нет)
2) узнать DNS-суффикс
3) DNS - сервера
4) IP-routing
5) NodeType (гибридный, не гибридный) :)


 
psa247 ©   (2006-10-14 19:17) [5]

Стал дальше разбирать, вот что получилось:


 type
     // Структура из которой мы получим все остальное
     PFIXED_INFO = ^ FIXED_INFO;
     FIXED_INFO = record
        HostName : array [0..MAX_HOSTNAME_LEN + 4] of char;
        DomainName : array [0..MAX_DOMAIN_NAME_LEN + 4] of char;
        CurrentDnsServer : PIP_ADDR_STRING;
        DnsServerList : IP_ADDR_STRING;
        NodeType : UINT;
        ScopeId : array [0..MAX_SCOPE_ID_LEN + 4] of char;
        EnableRouting : UINT;
        EnableProxy : UINT;
        EnableDns : UINT;
        end;

 function GetNetworkParams(pFixedInfo : pFIXED_INFO; var pOutBufLen :
ULONG): DWORD; stdcall; external "Iphlpapi.dll" name "GetNetworkParams";

 function GetNodeType(tmp : UINT): string;
 begin
{      case tmp of
        BROADCAST_NODETYPE : Result:= "BROADCAST_NODETYPE";
        PEER_TO_PEER_NODETYPE : Result:= "PEER_TO_PEER_NODETYPE";
        MIXED_NODETYPE : Result:= "MIXED_NODETYPE";
        HYBRID_NODETYPE :
        end;           {}
     Result:= "HYBRID_NODETYPE";
 end;

var  FixedInfo : PFIXED_INFO;

         if GetNetworkParams(nil, Len) = ERROR_BUFFER_OVERFLOW then begin
           GetMem(fixedInfo, Len);
           try
             if GetNetworkParams(fixedInfo, Len) = ERROR_SUCCESS then begin
               Form1.tvInterfaces.Items.AddChild(AdapterTree, "HostName: " +
                                 String(fixedInfo^.HostName) +"  "+ String(fixedInfo^.DomainName));
               if fixedInfo^.EnableDns = 1 then begin
                 DNSTree:= Form1.tvInterfaces.Items.AddChild(AdapterTree, "DNS: Enabled");
                 Form1.tvInterfaces.Items.AddChild(DNSTree, "DNS IP: " +
                                    String(fixedInfo^.CurrentDnsServer.IpAddress.S));
                 end;

               end;
             Form1.tvInterfaces.Items.AddChild(AdapterTree, "Node Type: " +GetNodeType(fixedInfo^.NodeType));

         finally
           FreeMem(fixedInfo);
           end;


Вопрос: где получить значения констант для определения типа дерева ?
 + состояние DNS-серверов (активен/неактивен)


 
psa247 ©   (2006-10-14 19:52) [6]

Проблема: в приведенном коде, domainName = "" из-за чего ?


 
psa247 ©   (2006-10-15 10:42) [7]

С бредом разобрался, помогите с определением состояния DNS.

Я получаю 9654544 из fixedInfo^.EnableDns, т.е. правильно ли использовать сравнение

if fixedInfo^.EnableDns > 0 Тогда "ДНС есть" иначе "Нет"
так ?


 
psa247 ©   (2006-10-21 09:55) [8]

HELP !

procedure release_IP(ind : cardinal);
var InterfaceInfo : PIP_INTERFACE_INFO;
  Len : ULONG;
  Res : DWORD;
  str : string;
begin
  Res:= GetInterfaceInfo(nil, @Len);
  if Res = ERROR_INSUFFICIENT_BUFFER then begin//ERROR_BUFFER_OVERFLOW then begin
    GetMem(InterfaceInfo, Res);
    try
      if GetInterfaceInfo(InterfaceInfo, @Len) = ERROR_SUCCESS then begin
        Res:= IpReleaseAddress(@InterfaceInfo^.Adapter[ind]);
        if Res = NO_ERROR then str:= "good"
      else begin
          str:= SysErrorMessage(Res);
          MessageBox(0,PChar(str),"",0);
          end;
        end;
    except

      end;
   end;
          str:= SysErrorMessage(Res);
          MessageBox(0,PChar(str),"",0);
end;

Результат вызова первого GetInterfaceInfo выдает ошибку Неверный параметр



Страницы: 1 вся ветка

Текущий архив: 2007.04.01;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.059 c
3-1168429862
sapsi
2007-01-10 14:51
2007.04.01
Access and VPN


11-1150844501
parovoZZ
2006-06-21 03:01
2007.04.01
Бросил на GRushPanel KolLabel...


2-1173777130
XTD
2007-03-13 12:12
2007.04.01
Использование %


5-1142439095
Alex603081
2006-03-15 19:11
2007.04.01
изменение/добавление свойств у стандартных компонентов


6-1161165997
Dmitry_177
2006-10-18 14:06
2007.04.01
Организация клиент-сервера через интернет, IP-сервера