SQLRU.net
Разработка приложений баз данных

Начало » Программирование » Delphi » DNS-суффикс подключения (получить полное имя хоста)
DNS-суффикс подключения [сообщение #2891] Tue, 01 August 2023 09:57 Переход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
Приветствую

ipconfig всегда отдает в любых конфигурациях dns или netbios(samba) корректный dns суффикс, откуда он его берет???

какое api не использовал никак не получается его вытащить, т.к. в общем случае это рабочая группа и прозрачный bind9, а суффиксы отдает DHCP сервер.

в идеале конечно чтоб не позже Delphi 7 библиотеки были, а лучше просто виндовое апи.

[Обновления: Tue, 01 August 2023 09:57]

Известить модератора

Re: DNS-суффикс подключения [сообщение #2892 является ответом на сообщение #2891] Tue, 01 August 2023 10:39 Переход к предыдущему сообщениюПереход к следующему сообщению
BlackEric в настоящее время не в онлайне  BlackEric
Сообщений: 294
Зарегистрирован: June 2022
Senior Member
How to get Windows DNS suffix search list using c++
Re: DNS-суффикс подключения [сообщение #2893 является ответом на сообщение #2892] Tue, 01 August 2023 10:45 Переход к предыдущему сообщениюПереход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
ни первой ветки реестра, ни второго параметра у меня нет (пустой), а ipconfig таки откуда то суффикс берет
Re: DNS-суффикс подключения [сообщение #2894 является ответом на сообщение #2893] Tue, 01 August 2023 11:15 Переход к предыдущему сообщениюПереход к следующему сообщению
BlackEric в настоящее время не в онлайне  BlackEric
Сообщений: 294
Зарегистрирован: June 2022
Senior Member
Компьютер\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlS et\Services\Tcpip\Parameters

Параметр DhcpDomain.

У меня совпадает с тем, что показывает IpConfig. Win 10
Re: DNS-суффикс подключения [сообщение #2895 является ответом на сообщение #2894] Tue, 01 August 2023 11:27 Переход к предыдущему сообщениюПереход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
а у меня нет, но смотрю что для адаптеров ниже по реестру
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces
уже он есть (их несколько так же как и показывает ipconfig)
поэтому желательно не беготня по реестру, а все таки API вызовы

[Обновления: Tue, 01 August 2023 11:29]

Известить модератора

Re: DNS-суффикс подключения [сообщение #2896 является ответом на сообщение #2895] Tue, 01 August 2023 11:36 Переход к предыдущему сообщениюПереход к следующему сообщению
BlackEric в настоящее время не в онлайне  BlackEric
Сообщений: 294
Зарегистрирован: June 2022
Senior Member
Для этого вроде бы нет API.
Re: DNS-суффикс подключения [сообщение #2897 является ответом на сообщение #2896] Tue, 01 August 2023 11:48 Переход к предыдущему сообщениюПереход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
кажется что должно быть где то здесь
https://learn.microsoft.com/ru-ru/windows/win32/api/iphlpapi/
Re: DNS-суффикс подключения [сообщение #2900 является ответом на сообщение #2897] Tue, 01 August 2023 14:03 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 345
Зарегистрирован: August 2022
Senior Member
И оно действительно есть:
https://learn.microsoft.com/en-us/windows/win32/api/iphlpapi /nf-iphlpapi-getadaptersaddresses
https://learn.microsoft.com/en-us/windows/win32/api/netioapi /nf-netioapi-getinterfacednssettings
Выдаётся гуглем первыми двумя ссылками по запросу "WinAPI get DNS suffix".

[Обновления: Tue, 01 August 2023 14:04]

Известить модератора

Re: DNS-суффикс подключения [сообщение #2901 является ответом на сообщение #2900] Tue, 01 August 2023 15:05 Переход к предыдущему сообщениюПереход к следующему сообщению
BlackEric в настоящее время не в онлайне  BlackEric
Сообщений: 294
Зарегистрирован: June 2022
Senior Member
Да, действительно. По первой ссылке даже пример рабочий.
Спасибо.
Re: DNS-суффикс подключения [сообщение #2904 является ответом на сообщение #2900] Tue, 01 August 2023 20:50 Переход к предыдущему сообщениюПереход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
спасибо, первый вариант вроде самый подходящий
осталось только разобраться как описать кучу взаимосвязанных структур на паскале )

https:// learn.microsoft.com/ru-ru/windows/win32/api/iptypes/ns-iptyp es-ip_adapter_addresses_lh?redirectedfrom=MSDN
Re: DNS-суффикс подключения [сообщение #2908 является ответом на сообщение #2904] Wed, 02 August 2023 06:59 Переход к предыдущему сообщениюПереход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
попробую взять структуру покороче для начала, может ее хватит
https:// learn.microsoft.com/en-us/windows/win32/api/iptypes/ns-iptyp es-ip_adapter_addresses_xp

ее то описание уже известно
https:// www.freepascal.org/daily/packages/winunits-jedi/jwaiptypes/_ ip_adapter_addresses.html
Re: DNS-суффикс подключения [сообщение #2909 является ответом на сообщение #2908] Wed, 02 August 2023 07:46 Переход к предыдущему сообщению
wolverin в настоящее время не в онлайне  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;
Предыдущая тема: Путевый TImage
Следующая тема: Теоретически/практический вопрос
Переход к форуму:
  


Текущее время: Sat Apr 27 22:40:27 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00703 секунд