Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как просканировать доступные ресурсы на сетевой машине? [D4, D5, Win95/98, NT4]


wHammer ©   (2001-11-06 11:43:00) 

Прошу извинения за уже не раз повторяющийся вопрос. Как, зная сетевой путь к машине в локальной сети, просканировать доступные папки/диски на нем? И как можно узнать read only ресурс или нет?


Kapusto   (2001-11-08 15:42:00) [1]

имхо для начала сканирования lpRemoteName = \\СетеваяМашина№1
А далее Enumеруем все ресурсы на данной машине
Варинат для извращенца -
Запускаем на выполнение
net view \\СетеваяМашина№1 > result.txt
и далее анализируем этот файл :)


wHammer   (2001-11-08 15:03:00) [2]

Как я понял в TNetResource нас интересует lpRemoteName, но при сканировании это поле пустое, я смогу добраться, например до \\СетеваяМашина№1\Temp, если укажу nrResource[i].lpRemoteName + "\Temp", но как мне узнать о существовании данной папки?


Kapusto   (2001-11-08 12:28:00) [3]

Я предлагал использовать код, сканирующий всю сетку, и проверять .lpRemoteName на вхождение \\Сетевая машина№1, если есть, то заносить в список - иначе пропускать...

Либо же, как вариант, протрассировать данный код до момента, когда он найдет в сети данную машину и срисовать, как заполнены в этот момент поля в TNetResource, и в своей проге перед WNetOpenEnum вручную присваивать полям структуры эти значения...


wHammer   (2001-11-08 11:27:00) [4]

\\СетеваяМашина№1. Здесь, например имеются сетевые папки
a: реально флопи дисковод,
d: реально диск D:,
Temp: реально папка C:\Public\User.
Как мне получить имена:
\\СетеваяМашина№1\a:
\\СетеваяМашина№1\d:
\\СетеваяМашина№1\Temp:

Sorry еще раз, но никак не могу сопоставить TNetResource и эти имена.


Kapusto   (2001-11-08 11:11:00) [5]

Не понял насчет r/o? или насчет выборочного скана?


wHammer   (2001-11-08 11:05:00) [6]

to Kapusto © (06.11.01 15:09)
Sorry, не понял.


Kapusto   (2001-11-06 15:09:00) [7]

Насчет Readonly имхо копать надо в сторону NetShareGetInfo, а насчет определенного компа - ну отфильруй полученный результат или заполняй начальный TNetResource вручную....


wHammer   (2001-11-06 14:41:00) [8]

Ну да, согласен, совсем старый стал, тем более раньше когда-то с помощью аналогичной процедуры писал программку для отслеживания времени работы в сети пользователей, и не вспомнил сразу, вот пень-то. Кстати, с помощью этой процедуры можно узнать и не только пользователей. Но мне нужно немного не то, нужно на одной, уже известной машине проверить доступные ресурсы и узнать read only они или нет.


Kapusto   (2001-11-06 14:27:00) [9]

угу :)) Это небольшая разминка для мозгов...
var
dummy: TNetResource;
.....
Scan(dummy, true);


wHammer   (2001-11-06 14:12:00) [10]

to Kapusto ©
???Sorry, но не получается Scan(nil, true);


wHammer   (2001-11-06 12:23:00) [11]

Сенкс, попробую!


Kapusto   (2001-11-06 12:17:00) [12]

Вот код, производящий полный скан сетки на наличие расшареных ресурсов
запускается как Scan(nil, true)
ЗЫ: Знаю, что можно оптимизировать, но лениво...

procedure TfMain.Scan(res: TNetResource; root: boolean);
var
hEnum: cardinal;
nrResource: array[0..1000] of TNetResource;
dwSize: DWORD;
numEntries: DWORD;
i: DWORD;
dwResult: DWORD;
begin
if root = true then
dwResult := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
0, nil, hEnum)
else
dwResult := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
0, @res, hEnum);
if dwResult = NO_ERROR then
begin
dwSize := SizeOf(nrResource);
numEntries := $0FFFFFFFF;
if WNetEnumResource(hEnum, numEntries, @nrResource, dwSize) = NO_ERROR then
begin
for i := 0 to numEntries - 1 do
begin
if nrResource[i].dwUsage <> RESOURCEUSAGE_CONNECTABLE then
begin
if nrResource[i].dwDisplayType = RESOURCEDISPLAYTYPE_SERVER then
begin
lbResources.Items.Add(nrResource[i].lpRemoteName);
lbResources.Update;
end;
Scan(nrResource[i], false)
end
else
begin
lbResources.Items.Add(nrResource[i].lpRemoteName);
lbResources.Update;
end;
end;
end;
WNetCloseEnum(hEnum);
end;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо