论坛: 原创软件 标题: 如何枚举目的机器的共享 复制本贴地址    
作者: fora [fora]    论坛用户   登录
res := WnetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
        RESOURCEUSAGE_CONNECTABLE, @NetResource,lphEnum);

        count :=$ffffffff;
        buffersize := 8192;
        getmem(buf,buffersize);
        res := WnetEnumResource(lphEnum,count,buf,buffersize);

但是这样获取的好象只有自己设定的共享文件夹,对默认共享如(IPC$,C$,ADMIN$)列举不出来,是不是我的参数设定有问题,请指教。

地主 发表时间: 05/14 17:24

回复: ricky [ricky]   版主   登录
需要两个函数一起用
WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,NULL,&En);
WNetEnumResource(En,&Count,nbuf,&len);


B1层 发表时间: 05/14 18:29

回复: fora [fora]   论坛用户   登录
和尚,我是一起用的呀,先Netopen再Netenum,但只列出我自己设定共享的目录了,其它默认的没有。

WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,NULL,&En);
倒数第二个参数怎么是空呢。我要把目的主机的地址指定呀。
@NetResource中包含了NetResource.lpRemoteName:='\\xxx.xxx.xxx.xxx';


B2层 发表时间: 05/14 19:04

回复: ricky [ricky]   版主   登录
第一个函数要用两次,这样你就可以把整个的网上邻居全部列出来了,我的马就是这么做的

B3层 发表时间: 05/15 08:40

回复: fora [fora]   论坛用户   登录
我不需要把整个网上邻居里的机器全列出来。用多次是先列出工作组,再列出机器名,然后是共享目录吧

我只想列出指定机器里的共享目录。
比如对“192.168.0.12”,我想列出它的c$,D$,E$,admin$,ipc$,以及“新建文件夹”之类的。

B4层 发表时间: 05/15 09:07

回复: ricky [ricky]   版主   登录
没有用过,所以没有发言权

B5层 发表时间: 05/16 09:00

回复: softlib [softlib]   论坛用户   登录
NetShareEnum()

B6层 发表时间: 05/16 17:27

回复: fora [fora]   论坛用户   登录
我在MSDN上也查到了。
The WNetEnumResource function does not enumerate users connected to a share; use the NetConnectionEnum function. Also, to enumerate hidden shares, use the NetShareEnum function.
   但我使用delphi写了一个NetShareEnum的程序,但它什么共享也列举不出来,没有找到原因。空连接我也建立了。
   下面是一段尝试的程序,不知什么地方有问题呀。各位老大帮忙看一下了。
    procedure TForm1.Button1Click(Sender: TObject);
var str : string;
    NetApiStatus : integer;
    servername : pwidechar;
    shareinfo : PShareinfo0;
    lpBuffer,h: pointer;
    entriesread, totalentries, resume_handle : integer;
    counter : integer;
    // str : string;
   aNetRes:TNETRESOURCE;
   Error: DWord;
   TimeOut:TimeVal;
begin
 fillchar(aNetRes,sizeof(TNetResource),0);
 anetRes.dwScope := RESOURCE_CONNECTED;
 anetRes.dwDisplayType :=  RESOURCEDISPLAYTYPE_SERVER;
 aNetRes.dwType := RESOURCETYPE_ANY;
 aNetRes.lpLocalName := '';
 aNetRes.lpProvider := '';
 str:='\\10.65.60.78\ipc$';
 aNetRes.lpRemoteName :=pchar(str);
 error :=    WNetAddConnection2(anetres,'','',0);
             TimeOut.tv_sec:=2;
             TimeOut.tv_usec:=0;
 if error = NO_ERROR then
 begin
         str := '\\10.65.60.78';
    getmem(servername,sizeof(widechar)*(length(str)+1));
    stringtowidechar(str,servername,sizeof(char)*(length(str)+1));
    repeat
      NetApiStatus := NetShareEnum(servername, 0, lpBuffer, -1, entriesread, totalentries, resume_handle);
      shareInfo := pShareinfo0(lpbuffer);
    for Counter := 0 to EntriesRead - 1 do
    begin
       showmessage(widechartostring(shareInfo^.shi0_netname));
       Inc(shareInfo);
    end;
    netapibufferfree(lpbuffer);
    until  (NetApiStatus <> ERROR_MORE_DATA);
    showmessage(inttostr(netapistatus));
    end;
end;

在另外一个单元文件中定义了:

function NetShareEnum(servername: LPWSTR; level: integer; var butptr: Pointer;prefmaxlen: integer; var entriesread: integer; var totalentries: integer; resume_handle: integer):NET_API_STATUS; stdcall;

implementation

function NetShareEnum; external netapi32lib name 'NetShareEnum';

先谢谢大家伙儿了

B7层 发表时间: 05/16 20:52

回复: softlib [softlib]   论坛用户   登录
给你摘段代码吧。

VOID WINAPI EnumShare(LPWSTR lpszServer)
{
   PSHARE_INFO_1 BufPtr,p;
   NET_API_STATUS res;
   DWORD er=0,tr=0,resume=0, i;

   do
   {
      res = NetShareEnum ( lpszServer, 1, (LPBYTE *) &BufPtr, -1, &er, &tr, &resume);

      if ( res == ERROR_SUCCESS || res == ERROR_MORE_DATA )
      {
         p = BufPtr;

         for ( i = 1; i <= er; i++ )
         {
            switch ( p->shi1_type )
            {
              case STYPE_DISKTREE:
                Form1->Memo1->Lines->Add( String(p->shi1_netname) + ": Disk driver");
                break;
              case STYPE_PRINTQ:
                Form1->Memo1->Lines->Add( String(p->shi1_netname) +  ": Printe queue");
                break;
              case STYPE_DEVICE:
                Form1->Memo1->Lines->Add( String(p->shi1_netname) +  ": Communication device");
                break;
              case STYPE_IPC:
                Form1->Memo1->Lines->Add( String(p->shi1_netname) +  ": Interprocess communication (IPC)");
                break;
              case STYPE_SPECIAL:
                Form1->Memo1->Lines->Add( String(p->shi1_netname) +  ": Special share");
                break;
              default:
                Form1->Memo1->Lines->Add( String(p->shi1_netname) +  ": Unknown share");
                break;
            }
              
            p++;
         }
         NetApiBufferFree(BufPtr);
      }
      else
      {
        ShowError(res);
      }

   }while (res==ERROR_MORE_DATA); 
   
   return;
}

B8层 发表时间: 05/17 00:08

回复: fora [fora]   论坛用户   登录
我在xfocus上也看到这一段代码了,c语言的我这儿也有一个,可以实现,但不知道为什么在delphi下不可以。



B9层 发表时间: 05/17 08:59

回复: fora [fora]   论坛用户   登录
谢谢,我已经找到错了,很低级
感谢softlib、和尚,:)

B10层 发表时间: 05/17 09:47

论坛: 原创软件

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号