Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2010, 11:53   #1
Robin_
Пользователь
 
Регистрация: 02.05.2008
Сообщений: 66
Печаль Считываем папки с полным доступом в локальной сети!

Добрый день!
Подскажите как считать папки с полным доступом в локальной сети!
Понимаю что делается все через NetEnumResource или NetShareEnum, не могу найти нормальный пример.
Делаю все так
Код:
type
  PNetResourceArray = ^TNetResourceArray;
  TNetResourceArray = array[0..MaxInt div SizeOf( TNetResource )-1] of TNetResource;

procedure EnumResources(LpNR: PNetResource);
var
  NetHandle: THandle;
  BufSize: integer;
  Size: integer;
  NetResources: PNetResourceArray;
  Count: Integer;
  NetResult: integer;
  i: integer;
  NewItem: TListItem;
begin
   if WNetOpenEnum( RESOURCE_GLOBALNET,
                    RESOURCETYPE_ANY,
                    // RESOURCETYPE_ANY - все ресурсы
                    // RESOURCETYPE_DISK - диски
                    // RESOURCETYPE_PRINT - принтеры
                    0, LpNR, NetHandle) <> NO_ERROR then Exit;
   try
      BufSize := 50 * SizeOf( TNetResource );
      GetMem( NetResources, BufSize );
      try
         while true do
         begin
            Count := -1;
            Size := BufSize;
            NetResult := WNetEnumResource( NetHandle, Cardinal( Count ), NetResources, Cardinal( Size ) );
            if NetResult = ERROR_MORE_DATA then
            begin
               BufSize := Size;
               ReallocMem( NetResources, BufSize );
               Continue;
            end;
            if NetResult <> NO_ERROR then Exit;
            for i := 0 to Count-1 do
            begin
               with NetResources^[I] do
               begin
                  if RESOURCEUSAGE_CONTAINER = ( DwUsage and RESOURCEUSAGE_CONTAINER ) then
                     EnumResources(@NetResources^[I]);
                  if dwDisplayType = RESOURCEDISPLAYTYPE_SHARE then
                  // ^^^^^^^^^^^^^^^^^^^^^^^^^^ - ресурс
                  // RESOURCEDISPLAYTYPE_SERVER - компьютер
                  // RESOURCEDISPLAYTYPE_DOMAIN - рабочая группа
                  // RESOURCEDISPLAYTYPE_GENERIC - сеть
                  begin
                     NewItem := Form1.ListView1.Items.Add;
                     NewItem.Caption := LpRemoteName;
                  end;
               end;
            end;
         end;
      finally
         FreeMem( NetResources, BufSize );
      end;
   finally
      WNetCloseEnum( NetHandle );
   end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  OldCursor: TCursor;
begin
   OldCursor := Screen.Cursor;
   Screen.Cursor := crHourGlass;
   with ListView1.Items do
   begin
      BeginUpdate;
      Clear;
      EnumResources( nil );
      EndUpdate;
   end;
   Screen.Cursor := OldCursor;
end;
Но в список попадает все что есть, а нужно только папки с общим доступом.
И сам процесс определения длится долго, может как нить можно его сократить?
Может быстрее будет через NetShareEnum?
У кого есть пример поделитесь пож-ста!
За ранее огромное спасибо!
Robin_ вне форума Ответить с цитированием
Старый 10.12.2010, 11:08   #2
Robin_
Пользователь
 
Регистрация: 02.05.2008
Сообщений: 66
По умолчанию

Нашел код вывода своих расшаренных папок.
Не могу вывести папки с полным доступом.
Не могу вывести папки с другой машины в сети.
Может кто подскажет что подправить, или как String загнать в PWChar.
Пробывал:
PWChar('\\Имякомпа\')
PWChar('Имякомпа')
PWChar('\\127.0.0.1\')
PWChar('127.0.0.1')
подставлять в NetShareEnumNT но никакого результата не дает!

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TShareInfo2 = packed record
  shi2_netname 			: PWChar;
  shi2_type			: DWORD;
  shi2_remark 			: PWChar;
  shi2_permissions		: DWORD;
  shi2_max_uses 		: DWORD;
  shi2_current_uses 		: DWORD;
  shi2_path 			: PWChar;
  shi2_passwd 			: PWChar;
 end;

 PShareInfo2 = ^TShareInfo2;
 TShareInfo2Array = array [0..512] of TShareInfo2;
 PShareInfo2Array = ^TShareInfo2Array;

var
  Form1: TForm1;
  NetShareEnumNT :function (ServerName	:PWChar;
                             Level		:DWORD;
                             Bufptr		:Pointer;
                             Prefmaxlen	:DWORD;
                             EntriesRead,
                             TotalEntries,
                             resume_handle:LPDWORD): DWORD; stdcall;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i:Integer;
  FLibHandle : THandle;
  ShareNT : PShareInfo2Array; 	//<= Перемеменные
  entriesread,totalentries:DWORD;  //<= для Windows NT

begin
  ListBox1.Items.Clear;
    FLibHandle := LoadLibrary('NETAPI32.DLL'); //Загружаем библиотеку
    if FLibHandle = 0 then Exit;
    //Связываем функцию
    @NetShareEnumNT := GetProcAddress(FLibHandle,'NetShareEnum');
    if not Assigned(NetShareEnumNT) then //Проверка
    begin
      FreeLibrary(FLibHandle);
      Exit;
    end;
    ShareNT := nil; //Очищаем указатель на массив структур
    //Вызов функции
    if NetShareEnumNT(nil,2,@ShareNT,DWORD(-1),
             @entriesread,@totalentries,nil) <> 0 then
    begin //Если вызов неудачен выгружаем библиотеку
      FreeLibrary(FLibHandle);
      Exit;
    end;
    if entriesread > 0 then //Обработка результатов
    for i:= 0 to entriesread - 1 do
            ListBox1.Items.Add(String(ShareNT^[i].shi2_netname));

  FreeLibrary(FLibHandle); //Не забываем выгрузить библиотеку
end;


end.
Robin_ вне форума Ответить с цитированием
Старый 10.12.2010, 11:27   #3
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
По умолчанию

если компьютер в сети находится и есть к нему доступ, зачем NetShareEnum использовать ? можно обратиться к нему как к любой папке на твоем же компьютере. к примеру копирование:
Код:
if copyfile('c:\1.txt','\\access\Obmen\1.txt',true) then
showmessage('кпирование успешно завершено');
считывание и прочее так же делать можно.
wm_leviathan вне форума Ответить с цитированием
Старый 13.12.2010, 06:32   #4
Robin_
Пользователь
 
Регистрация: 02.05.2008
Сообщений: 66
По умолчанию

Цитата:
Сообщение от wm_leviathan Посмотреть сообщение
если компьютер в сети находится и есть к нему доступ, зачем NetShareEnum использовать ? можно обратиться к нему как к любой папке на твоем же компьютере. к примеру копирование:
Код:
if copyfile('c:\1.txt','\\access\Obmen\1.txt',true) then
showmessage('кпирование успешно завершено');
считывание и прочее так же делать можно.
Я не знаю имен компьютеров, и путей к папкам!
Robin_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Socket: Подключение клиента из глобальной сети к серверу, расположенному в локальной сети Дамир Общие вопросы .NET 4 01.12.2010 12:12
MySQL - проблема с доступом по сети TaTT DoGG Софт 1 17.02.2010 13:32
Проблема с доступом в сети Ronni10 Операционные системы общие вопросы 6 07.10.2008 21:34
эмуляция локальной сети Vasya Свободное общение 2 26.10.2007 19:27