Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.03.15;
Скачать: CL | DM;

Вниз

Получить имя NetBIOS   Найти похожие ветки 

 
charoey_mag   (2009-01-22 15:52) [0]

Использую функцию так:
gethostbyaddr(@Addr, SizeOf(Addr), AF_NETBIOS);
или так
gethostbyaddr(@Addr, SizeOf(Addr), AF_INET);

Результаты одинаковые. Часть имен имя компа, а часть имя компа.домен.
Я так понимаю что имя компа.домен возвращает DNS сервер, так?
Можно ли запретить использование DNS в функции gethostbyaddr?


 
Сергей М. ©   (2009-01-22 15:58) [1]


> а часть имя компа.домен


В домене нет имен компов, там имена хостов.


 
charoey_mag   (2009-01-23 08:43) [2]

На сколько я понимаю имена хостов хранящиеся на сервере как в AD так и в DNS это локальные имена компьютеров. Эта фукнция !видимо! возвращает имена из запроса в разные службы, а кто первый ответит тот и прав.

И соответственно мне надо получить локальные имена не используя DNS и AD. Как?


 
Сергей М. ©   (2009-01-23 09:04) [3]

http://www.windowsfaq.ru/content/view/121/57/
http://rouse.drkb.ru/network.php (см. nbtstat.zip)


 
charoey_mag   (2009-01-23 10:16) [4]


> http://rouse.drkb.ru/network.php (см. nbtstat.zip)

То что надо, огромное спасибо.

Но, как всегда есть это ... но.
Вот код

function GetNetBiosNames(const Addr: String):string;
var
 NCB: TNCB;
 Enum: TLanaEnum;
 NetbiosInfo: TNetbiosInfo;
 I, A: Integer;
 Ends: Byte;
 fq1:boolean;
begin
 result:="";
 FillChar(NCB, SizeOf(TNCB), #0);
 NCB.ncb_command := Char(NCBENUM);
 NCB.ncb_buffer := @Enum;
 NCB.ncb_length := SizeOf(TLanaEnum);
 if Netbios(@NCB) = Char(NRC_GOODRET) then  <=============стр. 2
   for I := 0 to Integer(Enum.length) - 1 do
   begin
     FillChar(NCB, SizeOf(TNCB), #0);
     NCB.ncb_lana_num := Enum.lana[I];
     NCB.ncb_command := Char(NCBRESET);
     if Netbios(@NCB) = Char(NRC_GOODRET) then
     begin
       FillChar(NetbiosInfo, SizeOf(TNetbiosInfo), #0);
       NCB.ncb_command := Char(NCBASTAT);
       Move(Addr[1], NCB.ncb_callname[0], Length(Addr));
       NCB.ncb_buffer := @NetbiosInfo;
       NCB.ncb_length := SizeOf(TNetbiosInfo);
       fq1:=false;
       if Netbios(@NCB) = Char(NRC_GOODRET) then
         for A := 0 to NetbiosInfo.AdapterStatus.name_count - 1 do
         begin
           Ends := Byte(NetbiosInfo.NameBuffer[A].name[NCBNAMSZ - 1]);
           if Ends=$20 then
             begin
             NetbiosInfo.NameBuffer[A].name[NCBNAMSZ - 1] := #32;
             result:=String(NetbiosInfo.NameBuffer[A].name);
             fq1:=true;
             end;
         end;
       result:=result;    <================стр. 1
       if fq1=false then
         result:=result;
     end;
   end;
end;

Мне нужен только 1 параметр, я добавляю свою переменную fq1. НО!!!!
без сторки "стр. 1"(любой ничего не делающей команды) в "стр. 2" ответ на Netbios = $07("illegal buffer address").
Что это????

PS. Это только у меня for считает задом наперед и соответственно переворачивает значения в массивах??


 
Сергей М. ©   (2009-01-23 10:35) [5]



function GetNetBiosNames(const Addr: String):string;
type
 TNetbiosInfo = packed record
  AdapterStatus: TAdapterStatus;
  NameBuffer: Array [0..30] of TNameBuffer;
 end;

var
NCB: TNCB;
Enum: TLanaEnum;
NetbiosInfo: TNetbiosInfo;
I, A: Integer;
Ends: Byte;
begin
FillChar(NCB, SizeOf(TNCB), #0);
NCB.ncb_command := Char(NCBENUM);
NCB.ncb_buffer := @Enum;
NCB.ncb_length := SizeOf(TLanaEnum);
if Netbios(@NCB) = Char(NRC_GOODRET) then
  for I := 0 to Integer(Enum.length) - 1 do
  begin
    FillChar(NCB, SizeOf(TNCB), #0);
    NCB.ncb_lana_num := Enum.lana[I];
    NCB.ncb_command := Char(NCBRESET);
    if Netbios(@NCB) = Char(NRC_GOODRET) then
    begin
      FillChar(NetbiosInfo, SizeOf(TNetbiosInfo), #0);
      NCB.ncb_command := Char(NCBASTAT);
      Move(Addr[1], NCB.ncb_callname[0], Length(Addr));
      NCB.ncb_buffer := @NetbiosInfo;
      NCB.ncb_length := SizeOf(TNetbiosInfo);
      if Netbios(@NCB) = Char(NRC_GOODRET) then
        for A := 0 to NetbiosInfo.AdapterStatus.name_count - 1 do
        begin
          Ends := Byte(NetbiosInfo.NameBuffer[A].name[NCBNAMSZ - 1]);
          if Ends=$20 then
            begin
            NetbiosInfo.NameBuffer[A].name[NCBNAMSZ - 1] := #32;
            if result <> "" then
             Result := Result + #13#10;
            result := result + String(NetbiosInfo.NameBuffer[A].name);
            end;
        end;
    end;
  end;
end;


 
charoey_mag   (2009-01-23 10:52) [6]

Оп, вообще не понимаю, др вариант

function TMyThread.GetNetBiosNames(const Addr: String):string;
...............................
       fq1:=false;
       if Netbios(@NCB) = Char(NRC_GOODRET) then
         for A := 0 to NetbiosInfo.AdapterStatus.name_count - 1 do
         begin
           Ends := Byte(NetbiosInfo.NameBuffer[A].name[NCBNAMSZ - 1]);
           if Ends=$20 then
             begin
             NetbiosInfo.NameBuffer[A].name[NCBNAMSZ - 1] := #32;
             result:=String(NetbiosInfo.NameBuffer[A].name);
             fq1:=true;
             end
         end;
       if fq1=false then <======
        Ends:=0;        
     end;
   end;
end;

Почему присутствие этого if влияет на результат Netbios()??

Хм..., а на Delphi7 сервис паков случайно нет? Что то мне подсказывает что среда не всегда адекватна...


 
KSergey ©   (2009-01-23 11:05) [7]

> charoey_mag   (23.01.09 10:52) [6]
> Почему присутствие этого if влияет на результат Netbios()? ?

Может влияет на интерпретацию этих результатов, а не на сам результат?

> Хм..., а на Delphi7 сервис паков случайно нет? Что то мне
> подсказывает что среда не всегда адекватна...

Очень сомнительно, чтобы вы обнаружили баг. Не потому, что их нет в Д7, они есть, но далеко не в ифах :) Еще много надо копать, чтобы до них добраться.


 
charoey_mag   (2009-01-23 11:07) [8]


> Может влияет на интерпретацию этих результатов, а не на
> сам результат?

см [4]


 
Сергей М. ©   (2009-01-23 11:13) [9]


> charoey_mag   (23.01.09 10:52) [6]


Тебя чем не устроил код в [5] ?


 
charoey_mag   (2009-01-23 11:43) [10]


> Тебя чем не устроил код в [5] ?

Код под себя я все равно уже сделал, спасибо.

PS. в 5 в принципе не то, я просто в [4] ошибся там должно быть
if fq1=false then
 result:="Waring!"; //а не result
А по [5] получается если $20 не окажется то ничего и не изменится..

Меня больше интересует сама причина ошибки

и из [4]
>PS. Это только у меня for считает задом наперед и соответственно переворачивает значения в массивах??


 
Сергей М. ©   (2009-01-23 11:56) [11]


> Это только у меня


У всех, кто включил оптимизацию генерируемого компилятором кода.


> if fq1=false then
>  result:="Waring!"; //а не result


Какой телеге нужно это пятое колесо ?
Чем не устраивает

if result = "" then
Result:="Waring!";


?


 
charoey_mag   (2009-01-23 14:29) [12]

В вашем случае [5] проверка находится внурти
for A := 0 to NetbiosInfo.AdapterStatus.name_count - 1 do
     if Ends=$20 then
а надо делать снаружи цикла [4].


 
Сергей М. ©   (2009-01-23 15:07) [13]


> charoey_mag   (23.01.09 14:29) [12]


А зачем тебе вообще какая-то там проверка ?
И зачем вообще цикл по NetbiosInfo.AdapterStatus.name_count ?

Достаточно взять NetbiosInfo.NameBuffer[0] - это и будет интересующее тебя имя



Страницы: 1 вся ветка

Текущий архив: 2009.03.15;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
2-1232932287
Тимоха
2009-01-26 04:11
2009.03.15
перехват сообщения "восстановить"


2-1233056494
MaxX
2009-01-27 14:41
2009.03.15
Вопрос по свойству KeyPress


6-1200778609
VoV_I_K
2008-01-20 00:36
2009.03.15
Как передать событие из Jscript в приложение?


4-1206173020
nikfel
2008-03-22 11:03
2009.03.15
Как удалить файл без восстановления


2-1232915698
cchiko
2009-01-25 23:34
2009.03.15
Как мне в delphi запустить импорт базы данних