Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2007.04.01;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.043 c
2-1173105640
ITineraNT
2007-03-05 17:40
2007.04.01
Компоненты TRz..., Tabc...


3-1166972445
tigrenok_o
2006-12-24 18:00
2007.04.01
DBGrid в Word


1-1170597043
TStas
2007-02-04 16:50
2007.04.01
Как программно скачать из инета файл в определенное место?


11-1152395331
Сергеич
2006-07-09 01:48
2007.04.01
Как без нодов жить хорошо


15-1173540667
PARUS
2007-03-10 18:31
2007.04.01
JAVA на компе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский