WNetEnumResource или NetShareEnum -- smb расшарки компа
От: dpp Россия  
Дата: 08.02.03 17:42
Оценка:
Hi, all!

Задача такова: узнать, что расшаривает конкретный комп.
В MSDN нашел сампл:

ms-help://MS.VSCC/MS.MSDNVS/netmgmt/ntlmapi2_4l2l.htm
#define UNICODE
#include <windows.h>
#include <stdio.h>
#include <lm.h>

void wmain( int argc, TCHAR *lpszArgv[ ])
{
   PSHARE_INFO_502 BufPtr,p;
   NET_API_STATUS res;
   LPTSTR   lpszServer = NULL;
   DWORD er=0,tr=0,resume=0, i;

   switch(argc)
   {
   case 2:
      lpszServer = lpszArgv[1];
      break;
   default:
      printf("Usage: NetShareEnum <servername>\n");
      return;
   }
   //
   // Print a report header.
   //
   printf("Share:              Local Path:                   Uses:   Descriptor:\n");
   printf("---------------------------------------------------------------------\n");
   //
   // Call the NetShareEnum function; specify level 502. ????????????????? че такое это 502 ????????????
   //
   do // begin do
   {
      res = NetShareEnum ((LPSTR)lpszServer, 502, (LPBYTE *) &BufPtr, -1, &er, &tr, &resume);
      //
      // If the call succeeds,
      //
      if(res == ERROR_SUCCESS || res == ERROR_MORE_DATA)
      {
         p=BufPtr;
         //
         // Loop through the entries;
         //  print retrieved data.
         //
         for(i=1;i<=er;i++)
         {
            printf("%-20S%-30S%-8u",p->shi502_netname, p->shi502_path, p->shi502_current_uses);
            //
            // Validate the value of the 
            //  shi502_security_descriptor member.
            //
            if (IsValidSecurityDescriptor(p->shi502_security_descriptor))
               printf("Yes\n");
            else
               printf("No\n");
            p++;
         }
         //
         // Free the allocated buffer.
         //
         NetApiBufferFree(BufPtr);
      }
      else 
         printf("Error: %ld\n",res);
   }
   // Continue to call NetShareEnum while 
   //  there are more entries. 
   // 
   while (res==ERROR_MORE_DATA); // end do
   return;
}


Все бы хорошо было, да возникли следующие проблемы:
1) почему получаю ERROR_ACCESS_DENIED при .... компа без расшарок (только дефолтые), а на серве с линухом показывается админский вход, хотя к компу доступ полный а к серву, конечно, нет
2) почему получаю ERROR_ACCESS_DENIED на половине компов открывающился explorer'ом без проблем (с кучей расшарок)
3) почему при .... компа с лунухом в кач-ве ОС бОльшая задержка, хотя пинг до него 0
.... — это я слово подоврать не смог

может быть, это все из-за того же что написано в заметке к
DWORD WNetOpenEnum(
  DWORD dwScope,                // scope of enumeration
  DWORD dwType,                 // resource types to list
  DWORD dwUsage,                // resource usage to list
  LPNETRESOURCE lpNetResource,  // resource structure
  LPHANDLE lphEnum              // enumeration handle buffer
);

в MSDN: ms-help://MS.VSCC/MS.MSDNVS/wnet/networks_8wtp.htm -- линк из VC7 help.

dwUsage
[in] Specifies the resource usage type to enumerate.
RESOURCEUSAGE_ATTACHED
Setting this value forces WNetOpenEnum to fail if the user is not authenticated. The function fails even if the network allows enumeration without authentication.

Вопрос:
Почему получаются выше перечисленные вещи и как их избежать.
(А, заодно, как отфильтровать принтеры и такие как C$ D$ admnt$ и пр?)

Про всевозможные опции к WNetEnumResource и NetShareEnum я в MSDN, конечно читал, но че-то не могу разобраться ( с WNetEnumResource вообще беда )
Как с помощью WNetEnumResource организовать выше приведенный пример, также не понятно. В MSDN приведен только пример со сканированием всей сети, а какие параметры менять, чтоб проделать это же с отдельным компом разобраться не могу.

Кстати что из них лучше использовать с точки зрения: скорость, простота (и пр. аргументы)

Заранее всем спасибо.
Плиз помогите ламаку, который смотрит в книгу (в данном случае в монитор с открытым MSDN), а видит ...

ЗЫ: Вообще-то я поисковик по сетевым расшаркам пишу (точней, написал уже все кроме автоматического сканирования компа на предмет расшарок). А с ним (поисковиком) еще одна проблемка — уж очень высокая скорость поиска чевой-то и это безо всякой оптимизации! открыл файл со структурами, считал оду и при помощи strstr выбрал — подходит она к запросу или нет. А потом еще и всех родителей нашел и считал. 130 вхождений — средней глубины 7 вложенностей не успеваешь заметить глазом...
И слишком маленькая БД — 5гб с 30000 файлов укладываются в 300кб хотя проверял — ничего не теряется.
Кто с подобными вещами знаком подскажите плиз типичные время/размер, а то может я че-то умное придумал

ЗЫ:ЗЫ: кому интерестно, пишите mailto:dpp@rbcmail.ru а то исходники не выложишь — уж очень там много.
Re: Оффтоп
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 13.02.03 13:17
Оценка:
Здравствуйте, dpp, Вы писали:

dpp>проблемка — уж очень высокая скорость поиска чевой-то

dpp>И слишком маленькая БД — 5гб с 30000 файлов укладываются в 300кб хотя проверял — ничего не теряется.

Ну, как сказал тут один мой коллега: "Он может смело резюме в Goole слать..."

Цифры потрясные. Никому ранее невиданные при условии, что файлы — текстовые, (объемом 5Г, количеством 30К штук).

Если при этой базе еще и найти что-то можно — снимаю шляпу.

Если бы ты еще привел скорость построения этой базы... Даже из файлов, оежащих на твоем локальном компе (без работы с сетью и всего такого)...

Лучший результат, который я видел пока (по размеру базы, не по качеству поиска) — давал коэффициент сжатия 10 при скорости где-то 3Г в час (индексирования локального компа). И при этом у них еще и что-то найти можно.
Алексей Кирдин
Re[2]: Оффтоп
От: dpp Россия  
Дата: 13.02.03 16:49
Оценка:
Здравствуйте, Kaa, Вы писали:

Kaa>Здравствуйте, dpp, Вы писали:


dpp>>проблемка — уж очень высокая скорость поиска чевой-то

dpp>>И слишком маленькая БД — 5гб с 30000 файлов укладываются в 300кб хотя проверял — ничего не теряется.

Kaa>Ну, как сказал тут один мой коллега: "Он может смело резюме в Goole слать..."


Kaa>Цифры потрясные. Никому ранее невиданные при условии, что файлы — текстовые, (объемом 5Г, количеством 30К штук).


Kaa>Если при этой базе еще и найти что-то можно — снимаю шляпу.


Kaa>Если бы ты еще привел скорость построения этой базы... Даже из файлов, оежащих на твоем локальном компе (без работы с сетью и всего такого)...


с этого кол-ва файлов по 100Мб сети около минуты

Kaa>Лучший результат, который я видел пока (по размеру базы, не по качеству поиска) — давал коэффициент сжатия 10 при скорости где-то 3Г в час (индексирования локального компа). И при этом у них еще и что-то найти можно.


Вы немного недопоняли меня. И виновата в этом моя терминогогия.
Я пишу поисковик по ресурсам (списку shared файлов и папок) локальной сети (около 700-1000 компов, и все че-то шарят — одним словом общага)
А на счет скоростей : мне были интерестны типичное отношение (размер БД)/(Скорость поиска)/(типичные применяемые алгоритмы поиска)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.