Начало » Программирование » Delphi » DNS-суффикс подключения (получить полное имя хоста)
DNS-суффикс подключения [сообщение #2891] |
Tue, 01 August 2023 09:57 |
wolverin
Сообщений: 42 Зарегистрирован: August 2023
|
Member |
|
|
Приветствую
ipconfig всегда отдает в любых конфигурациях dns или netbios(samba) корректный dns суффикс, откуда он его берет???
какое api не использовал никак не получается его вытащить, т.к. в общем случае это рабочая группа и прозрачный bind9, а суффиксы отдает DHCP сервер.
в идеале конечно чтоб не позже Delphi 7 библиотеки были, а лучше просто виндовое апи.
[Обновления: Tue, 01 August 2023 09:57] Известить модератора
|
|
|
|
|
|
Re: DNS-суффикс подключения [сообщение #2895 является ответом на сообщение #2894] |
Tue, 01 August 2023 11:27 |
wolverin
Сообщений: 42 Зарегистрирован: August 2023
|
Member |
|
|
а у меня нет, но смотрю что для адаптеров ниже по реестру
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces
уже он есть (их несколько так же как и показывает ipconfig)
поэтому желательно не беготня по реестру, а все таки API вызовы
[Обновления: Tue, 01 August 2023 11:29] Известить модератора
|
|
|
|
|
|
|
|
|
Re: DNS-суффикс подключения [сообщение #2909 является ответом на сообщение #2908] |
Wed, 02 August 2023 07:46 |
wolverin
Сообщений: 42 Зарегистрирован: August 2023
|
Member |
|
|
рабочий черновой вариант на основе виндового примера
мож кому пригодится
function GetHostDomain: string;
const
DLL = 'IPHLPAPI.DLL';
MAX_ADAPTER_ADDRESS_LENGTH = 8;
GAA_FLAG_INCLUDE_ALL_INTERFACES = $100;
WORKING_BUFFER_SIZE = 15000;
MAX_TRIES = 3;
type
ULONGLONG = UINT64;
PSOCKADDR = ^SOCKADDR;
SOCKADDR = record
sa_family: u_short;
sa_data: array[1..14] of Char;
end;
SOCKET_ADDRESS = record
lpSockaddr: PSOCKADDR;
iSockaddrLength: Integer;
end;
IP_PREFIX_ORIGIN = (
IpPrefixOriginOther = 0,
IpPrefixOriginManual,
IpPrefixOriginWellKnown,
IpPrefixOriginDhcp,
IpPrefixOriginRouterAdvertisement,
IpPrefixOriginUnchanged = $10
);
IP_SUFFIX_ORIGIN = (
NlsoOther = 0,
NlsoManual,
NlsoWellKnown,
NlsoDhcp,
NlsoLinkLayerAddress,
NlsoRandom,
IpSuffixOriginOther = 0,
IpSuffixOriginManual,
IpSuffixOriginWellKnown,
IpSuffixOriginDhcp,
IpSuffixOriginLinkLayerAddress,
IpSuffixOriginRandom,
IpSuffixOriginUnchanged = $10
);
IP_DAD_STATE = (
NldsInvalid,
NldsTentative,
NldsDuplicate,
NldsDeprecated,
NldsPreferred,
IpDadStateInvalid = 0,
IpDadStateTentative,
IpDadStateDuplicate,
IpDadStateDeprecated,
IpDadStatePreferred
);
PIP_ADAPTER_UNICAST_ADDRESS = ^IP_ADAPTER_UNICAST_ADDRESS;
IP_ADAPTER_UNICAST_ADDRESS = record union: record
case Integer of
0: (Alignment: UInt64);
1: (Length: ULONG;
Flags: DWORD);
end;
Next: PIP_ADAPTER_UNICAST_ADDRESS;
Address: SOCKET_ADDRESS;
PrefixOrigin: IP_PREFIX_ORIGIN;
SuffixOrigin: IP_SUFFIX_ORIGIN;
DadState: IP_DAD_STATE;
ValidLifetime: ULONG;
PreferredLifetime: ULONG;
LeaseLifetime: ULONG;
end;
PIP_ADAPTER_ANYCAST_ADDRESS = ^IP_ADAPTER_ANYCAST_ADDRESS;
IP_ADAPTER_ANYCAST_ADDRESS = record union: record
case Integer of
0: (Alignment: UINT64);
1: (Length: ULONG;
Flags: DWORD);
end;
Next: PIP_ADAPTER_ANYCAST_ADDRESS;
Address: SOCKET_ADDRESS;
end;
PIP_ADAPTER_MULTICAST_ADDRESS = ^IP_ADAPTER_MULTICAST_ADDRESS;
IP_ADAPTER_MULTICAST_ADDRESS = record union: record
case Integer of
0: (Alignment: UINT64);
1: (Length: ULONG;
Flags: DWORD);
end;
Next: PIP_ADAPTER_MULTICAST_ADDRESS;
Address: SOCKET_ADDRESS;
end;
PIP_ADAPTER_DNS_SERVER_ADDRESS = ^IP_ADAPTER_DNS_SERVER_ADDRESS;
IP_ADAPTER_DNS_SERVER_ADDRESS = record union: record
case Integer of
0: (Alignment: UINT64);
1: (Length: ULONG;
Reserved: DWORD);
end;
Next: PIP_ADAPTER_DNS_SERVER_ADDRESS;
Address: SOCKET_ADDRESS;
end;
PIP_ADAPTER_PREFIX = ^IP_ADAPTER_PREFIX;
IP_ADAPTER_PREFIX = record union: record
case Integer of
0: (Alignment: UINT64);
1: (Length: ULONG;
Flags: DWORD);
end;
Next: PIP_ADAPTER_PREFIX;
Address: SOCKET_ADDRESS;
PrefixLength: ULONG;
end;
IF_OPER_STATUS = (
IfOperStatusUp = 1,
IfOperStatusDown,
IfOperStatusTesting,
IfOperStatusUnknown,
IfOperStatusDormant,
IfOperStatusNotPresent,
IfOperStatusLowerLayerDown
);
PIP_ADAPTER_ADDRESSES = ^IP_ADAPTER_ADDRESSES;
IP_ADAPTER_ADDRESSES = record union: record
case Integer of
0: (Alignment: ULONGLONG);
1: (Length: ULONG;
IfIndex: DWORD);
end;
Next: PIP_ADAPTER_ADDRESSES;
AdapterName: PCHAR;
FirstUnicastAddress: PIP_ADAPTER_UNICAST_ADDRESS;
FirstAnycastAddress: PIP_ADAPTER_ANYCAST_ADDRESS;
FirstMulticastAddress: PIP_ADAPTER_MULTICAST_ADDRESS;
FirstDnsServerAddress: PIP_ADAPTER_DNS_SERVER_ADDRESS;
DnsSuffix: PWCHAR;
Description: PWCHAR;
FriendlyName: PWCHAR;
PhysicalAddress: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of BYTE;
PhysicalAddressLength: DWORD;
Flags: DWORD;
Mtu: DWORD;
IfType: DWORD;
OperStatus: IF_OPER_STATUS;
Ipv6IfIndex: DWORD;
ZoneIndices: array[0..15] of DWORD;
FirstPrefix: PIP_ADAPTER_PREFIX;
end;
var
lib: THandle;
GetAdaptersAddresses: function(Family: ULONG; Flags: ULONG; Reserved: Pointer; AdapterAddresses: PIP_ADAPTER_ADDRESSES; SizePointer: PULONG): ULONG; stdcall;
pAddr, pAddrCurr: PIP_ADAPTER_ADDRESSES;
len: ULONG;
i: Integer;
rc: DWORD;
Label
_END;
begin
Result := '';
lib := LoadLibrary(DLL);
if lib = 0 then exit;
GetAdaptersAddresses := GetProcAddress(lib, PAnsiChar(AnsiString('GetAdaptersAddresses')));
if Not Assigned(GetAdaptersAddresses) then goto _END;
pAddr := nil;
len := WORKING_BUFFER_SIZE;
rc := NO_ERROR;
for i := 1 to MAX_TRIES do
begin
if Assigned(pAddr) then FreeMem(pAddr);
GetMem(pAddr, len);
if Not Assigned(pAddr) then goto _END;
rc := GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_ALL_INTERFACES, nil, pAddr, @len);
if rc <> ERROR_BUFFER_OVERFLOW then Break;
end;
if rc = NO_ERROR then
begin
pAddrCurr := pAddr;
while Assigned(pAddrCurr) do
begin
if Assigned(pAddrCurr.DnsSuffix) then
if Length(pAddrCurr.DnsSuffix) > 0 then
begin
Result := pAddrCurr.DnsSuffix;
Break;
end;
pAddrCurr := pAddrCurr.Next;
end;
end;
FreeMem(pAddr);
_END:
FreeLibrary(lib);
end;
|
|
|
Переход к форуму:
Текущее время: Wed Dec 18 15:05:57 GMT+3 2024
Общее время, затраченное на создание страницы: 0.01370 секунд
|