2013-03-06 2 views
12

Я использую GetHostByName, чтобы получить IP-адрес от хоста/DNS. У меня также есть Kaspersky Internet Security 2013 и заметил, что GetHostByName получает его. Похоже, что мой процесс пытается создать подраздел в hklm\SYSTEM\CONTROLSET001\SERVICES\TCPIP\PARAMETERS. Это на самом деле означает, что я НЕ МОГУ использовать эту функцию, если у пользователя нет прав администратора. Есть ли другой способ решения host/dns?Получить IP-адрес из DNS без GetHostByName

EDIT: Вот скриншот:

enter image description here

EDIT2: я использовал getaddrinfo и KIS не "обнаружить что-нибудь". Я бы хотел использовать его, но мне все равно понравилась бы поддержка Win2K.

EDIT3: Добавлена ​​Debug ScreenShot

enter image description here

EDIT4: Это мой "Тест" Код:

program Project2; 

{$APPTYPE CONSOLE} 

uses 
    Winsock; 

var 
    DummyWSA : WSADATA; 

begin 
    if WSAStartup($0202, DummyWSA) = 0 then begin 
    GetHostByName ('localhost'); 
    end; 
    readln; 
end. 

EDIT5: GetAddrInfo версия ...

program Project2; 

{$APPTYPE CONSOLE} 

uses 
    Winsock; 

type 
    PAddrInfo = ^TAddrInfo; 
    TAddrInfo = packed record 
    ai_flags: Integer; 
    ai_family: Integer; 
    ai_socktype: Integer; 
    ai_protocol: Integer; 
    ai_addrlen: LongWord; 
    ai_canonname: Array of Char; 
    ai_addr: PSOCKADDR; 
    ai_next: PAddrInfo; 
    end; 

function getaddrinfo(const nodename: PChar; const servname : PChar; const hints: PAddrInfo; var res: PAddrInfo): Integer; stdcall; external 'ws2_32.dll' name 'getaddrinfo'; 
procedure freeaddrinfo(ai: PAddrInfo); stdcall; external 'ws2_32.dll' name 'freeaddrinfo'; 

var 
    DummyWSA  : WSADATA; 
    SocketHint : PAddrInfo; 
    SocketResult : PAddrInfo; 

begin 
    if WSAStartup($0202, DummyWSA) = 0 then begin 
    //GetHostByName ('localhost'); 
    getaddrinfo ('localhost', '80', SocketHint, SocketResult); 
    // getaddrinfo ('localhost', NIL, SocketHint, SocketResult); // Not sure if I can NIL the port... 
    end; 
    readln; 
end. 

Эта версия похоже, ничего не пишет в реестре ...

+1

Если есть, у этого, вероятно, будет тот же конфликт с Kaspersky. Вы не можете вызвать GetHostByName как не-админ. Как выглядит стек вызовов? –

+1

Вы * пробовали * используя эту функцию и видите, что она на самом деле * сбой *, вы просто * предполагаете *, что он будет терпеть неудачу на основании того, что вы читаете в этом стеке вызовов, который у вас есть? Потому что я могу сказать вам, что «GetHostByName» не ограничивается только учетными записями администратора. –

+0

Я добавил скриншот «обнаружения». Предполагается, что вы можете писать только в HKLM, если у вас есть права администратора. –

ответ

15

gethostbyname() - это правильный способ запроса имени хоста через DNS (getaddrinfo() - лучший выбор, особенно если вам нужно поддерживать IPv6), и это определенно НЕ ограничено только администраторами. В большинстве приложений используется gethostbyname() (и/или getaddrinfo()), поэтому маловероятно, что Kaspersky собирается заблокировать его.

Почему, по вашему мнению, gethostbyname() создает ключ реестра? Что на самом деле создается? Он ничего не должен создавать. Это может означать, что какой-то внешний код подключен к gethostbyname().

+0

Я тоже использовал getaddrinfo, но мне нужна поддержка Win2K. –

+1

+1 для «Это может означать, что какой-то внешний код подключен к gethostbyname()» – kobik

+0

Я добавил экран OllyDebug. –

Смежные вопросы