Форум: "Сети";
Текущий архив: 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