Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];

Вниз

Определение сетевых групп   Найти похожие ветки 

 
Stef   (2004-10-11 11:53) [0]

Подскажите как определить какие есть сетевые группы, без их сканирования?


 
Дмитрий Ботвин   (2004-10-11 14:43) [1]

Без сканирования самих групп можно, просканировав "провайдера",
например "Сеть Microsoft Windows" на наличие рабочих групп.
А без сканирования как такогого не определишь....


 
Stef   (2004-10-11 18:16) [2]

не плохой способ. можно опробовать.

просто интересная задача. попробовать убыстрить сканирование сети. Как? Занимаюсь этим. Пока не очень получаеться.


 
Rouse_ ©   (2004-10-11 21:48) [3]

Убыстрить? Очень легко...
Диапазон IP известен?
Если да, то запускаем несколько потоков на диапазон и на каждый адрес запускаем WNetOpenEnum
в котором заполняем соответствующим образом 4 параметр имеющий тип TNetResource

пример заполнения:

// Задача этой функции предельно проста:
// При известном имени компьютера мы можем заполнить структуру
// и передать ее функции WNetGetResourceParent которая и вернет
// нам предка, в моем случае группу. Как она будет вести себя
// при наличии доменов, не знаю. Проверишь сам...
// Да, чуть не забыл, если имя компьютера есть в кэше, а сам
// компьютер отключен, то в качестве результата будет либо
// пустая строка либо "Нет данных"...
// Поэтому опять придется сканировать, если слишком уж критично...
function TMainForm.GetGroup(const CompName: String): String;
var
 CurrRes: TNetResource;
 ParentName: array [0..1] of TNetResource;
 Enum: DWORD;
 Err: Integer;
begin
 with CurrRes do
 begin
   dwScope := RESOURCE_GLOBALNET;
   dwType := RESOURCETYPE_DISK;
   dwDisplayType := RESOURCEDISPLAYTYPE_SERVER;
   dwUsage := RESOURCEUSAGE_CONTAINER;
   lpLocalName := "";
   lpRemoteName := PChar("\\" + CompName);
   lpComment := "";
   lpProvider := nil;
 end;
 Enum := SizeOf(ParentName);
 Err := WNetGetResourceParent(@CurrRes, @ParentName, Enum);
 if Err = NO_ERROR then
 begin
   Result := ParentName[0].lpRemoteName;
   if Result = "" then Result := RES_COM_NO;
 end
 else
   MessageDlg(ERR_PAR, mtError, [mbOK], 0);
end;


общее демо на http://rouse.front.ru


 
Rouse_ ©   (2004-10-11 21:53) [4]

Даже сам наврал :)
Группа как раз вернется результатом выполнения данной функции, lpProvider только нужно будет правильно подставить, под рукой кода его определения нет, но я его приводил Дмитрию Ботвину, возможно у него сохранился...
В случае домена - вернется имя домена куда входит компьютер...


 
Rouse_ ©   (2004-10-11 21:58) [5]

т.е. общий алгоритм таков, по диапазону IP получаем имена компьютеров и (подставляя lpProvider и передавая функции имя компьютера) получаем все имеющиеся группы...


 
pepperok   (2004-10-12 02:10) [6]

Rabotaet horosho !!!!
no kak uznat diapazon ip-shnikov??
i esho !!

Ja na etom sajte davnenko skachival toli statejku toli post iz foruma s prostenkoj procedurkoj kotoraja po imeni rabochej gruppi vivodit spisok vseh tachek v rabochej gruppe prichem delaet eto ochen shustrenko !!u menya v seti okolo 300 tachek i 3 rabochie gruppi i esli skanit tvioim sposobom to dolgovato budet, bez 10 ka potokov ne obojtis.

Nikto ne znaet kak prosto poluchit spisok rabochih grup (i zelatelno shustrenko) !??


 
Дмитрий Ботвин   (2004-10-12 08:10) [7]

lpProvider можно получить, как сказал Rouse, следующим кодом:

function GetProvider:String;
 var
   Buffer: array [0..255] of Char;
   Size: DWORD;
 begin
   Size := SizeOf(Buffer);
   if WNetGetProviderName(WNNC_NET_LANMAN, @Buffer, Size) <>
      NO_ERROR then
      Result := "Unknown"
   else Result := String(Buffer);
 end;
 
А список рабочих групп можно получить так:

procedure GroupThread.FindGroups;
 const MaxWG=100;
 var
   I: integer;
   Entries,EnumError,EnumBufferLength: DWORD;
   NetName: string;
   EnumHandle: THandle;
   Network: TNetResource;
   EnumBuffer: array[1..MaxWG] of TNetResource;
 begin
   Form1.Groups.Clear;
   NetName:=GetProvider;
   FillChar(Network, SizeOf(Network),0);
   with Network do
     begin
       dwScope := 2;
       dwType := 3;
       dwDisplayType := 1;
       dwUsage := 2;
       lpProvider := @NetName[1];
     end;
   EnumError := WNetOpenEnum(RESOURCE_GLOBALNET,
                RESOURCETYPE_DISK, 0, @Network, EnumHandle);
   if EnumError = NO_ERROR then
     begin
       Entries := MaxWG;
       EnumBufferLength := SizeOf(EnumBuffer);
       EnumError := WNetEnumResource(EnumHandle, Entries,
                    @EnumBuffer, EnumBufferLength);
       if EnumError = NO_ERROR then
         for I := 1 to Entries do
           begin
             Form1.Groups.Items.Add(Trim(EnumBuffer
                                    [I].lpRemoteName));
             Application.ProcessMessages;
           end;
       WNetCloseEnum(EnumHandle);
     end;
 end;

Запускай это в потоке. У меня сеть из 211 компов и 25 рабочих
групп. Получает список рабочих групп примерно за 4 сек. первый
раз и меньше 1 сек при повторном сканировании....


 
Stef   (2004-10-12 12:22) [8]

2 Дмитрий Ботвин   (12.10.04 08:10) [7]
Заметино быстро.
Пасибо



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

Форум: "Сети";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.035 c
1-1102797398
Hmm
2004-12-11 23:36
2004.12.26
Проблемма: вместо 0,99999999999 пишет 1 - округляет. =((


14-1102416695
vajo
2004-12-07 13:51
2004.12.26
12 декабря - Праздник? Т.Е. 13 декабря - Выходной?


6-1097758501
Григорьев Антон
2004-10-14 16:55
2004.12.26
Как авторизоваться на прокси?


1-1102143951
Viktop
2004-12-04 10:05
2004.12.26
Перемещение с PageControl на Frame2


14-1101994838
Anton_K
2004-12-02 16:40
2004.12.26
Глюк компилятора (в Delphi 7)?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский