![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ipconfig на Delphi [D6, WinXP]
psa247 © (2006-10-11 17:26:00)Код
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-21 09:55:00) [1]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 выдает ошибку Неверный параметр
psa247 (2006-10-15 10:42:00) [2]С бредом разобрался, помогите с определением состояния DNS.
Я получаю 9654544 из fixedInfo^.EnableDns, т.е. правильно ли использовать сравнение
if fixedInfo^.EnableDns > 0 Тогда "ДНС есть" иначе "Нет"
так ?
psa247 (2006-10-14 19:52:00) [3]Проблема: в приведенном коде, domainName = '' из-за чего ?
psa247 (2006-10-14 19:17:00) [4]Стал дальше разбирать, вот что получилось:
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 10:19:00) [5]Осталось:
1) как определить autoconfiguration (да/нет)
2) узнать DNS-суффикс
3) DNS - сервера
4) IP-routing
5) NodeType (гибридный, не гибридный) :)
Rouse_ (2006-10-11 20:55:00) [6]Эээ... оно? http://rouse.drkb.ru/files/netifenum.zip
psa247 (2006-10-11 17:28:00) [7]и еще: как "перегнать"
LeaseObtained : LongInt;
в дату ?
psa247 (2006-10-11 17:26:00) [8]
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
?