|
作者: fora [fora] 论坛用户 | 登录 |
以前写过一小段程序,列举共享的,因为实验条件有限,网内的所有机器除了UNIX和linux,几乎都是2K和XP,所以程序一直没有对98操作过。 现在要用了,装了98做测试,发现98上的共享列举不出来,时间很急了,请大家帮忙。 下面是以前的一段代码。用的是NetShareEnum. form1.Memo_ScanInfo.lines.add('***'+ node.Text +' NetBios 列表 ***'); resume :=0; tr := 0; er := 0; repeat nStatus := NetShareEnum(ipaddress,1,lpBuffer,$ffffffff, er, tr, @resume); Shareinfo := PshareInfo1(lpbuffer); if shareinfo<> nil then begin sharenode := form1.TreeView1.Items.AddChild(node,'共享资源'); sharenode.SelectedIndex:= 10; sharenode.ImageIndex := 10; sharenode.Expanded := true; end; if nstatus = NO_ERROR then for i:=0 to er-1 do begin form1.Memo_ScanInfo.lines.add('共享名: '+widechartostring(shareinfo^.shi1_netname)); tempnode:= form1.TreeView1.Items.AddChild(sharenode,widechartostring(shareinfo^.shi1_netname)); tempnode.SelectedIndex:=14; tempnode.ImageIndex :=14; tempnode.Expanded:=true; inc(shareinfo); end else form1.Memo_ScanInfo.lines.add('列举共享资源失败'); if lpbuffer<> nil then NetApiBufferFree(lpbuffer); until (nstatus <> ERROR_MORE_DATA); 大家找找原因,谢谢。 如果请有98下列举共享的代码就更好了,不论什么语言,请帮忙回一下 |
地主 发表时间: 08/25 21:59 |
回复: ricky [ricky] 版主 | 登录 |
我用的是WNetOpenEnum函数,一切ok,你可以试试 |
B1层 发表时间: 08/26 11:57 |
回复: fora [fora] 论坛用户 | 登录 |
使用NetShareEnum主要是因为可以列举默认共享 我也尝试了你说的那个函数,但好象也不行,你能给段源码吗。 指定机器,假设是98的共享。 我再贴一段使用第二个函数的。 fillchar(netresource,sizeof(Tnetresource),0); str := '\\'+edit2.text ; netresource.lpRemoteName := pchar(str); netresource.dwDisplayType := RESOURCEDISPLAYTYPE_SHARE; netresource.dwScope := RESOURCE_GLOBALNET; NetResource.dwUsage := RESOURCEUSAGE_CONTAINER; // NetResource.dwScope := RESOURCETYPE_DISK;//列举文件资源信息 res := WnetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_any, 0, @NetResource,lphEnum); if res <> NO_ERROR then exit; while true do begin count :=$ffffffff; buffersize := 8192; getmem(buf,buffersize); res := WnetEnumResource(lphEnum,count,buf,buffersize); If Res = ERROR_NO_MORE_ITEMS Then break;//资源列举完毕 If (Res <> NO_ERROR) then Exit;//执行失败 Temp := TNetResourceArray(Buf); For Ind := 0 to Count - 1 do begin showmessage(Temp^.lpRemoteName + 2); inc(temp); end; end; Res := WNetCloseEnum(lphEnum);//关闭一次列举 If Res <> NO_ERROR Then exit;//执行失败 FreeMem(Buf); 返回WNetOpenEnum时为51(The remote computer is not available.),以前还有返回53(The network path was not found.)的。 和尚,帮个忙呀 |
B2层 发表时间: 08/26 13:07 |
回复: fora [fora] 论坛用户 | 登录 |
又试了一下, 把str := '\\'+edit2.text ;改为str := edit2.text ;WnetOpenEnum顺利通过,没有错误,但WnetEnumResource返回259(No more data is available.) 但主机确实有共享的。 |
B3层 发表时间: 08/26 13:16 |
回复: ricky [ricky] 版主 | 登录 |
给你源码,大致上是这个意思,可以列出所有的共享,包括打印机: if (NetName == NULL) ret = WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,NULL,&En); else { nr.dwUsage = Usage; nr.lpRemoteName = NetName; nr.lpProvider = lpProvider; nr.lpComment = NULL; nr.lpLocalName = NULL; ret = WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,&nr,&En); } if (ret != NO_ERROR) return 0; n = sizeof(nr); Count = 0xffffffff; ret = WNetEnumResource(En,&Count,nbuf,&len); if (ret != NO_ERROR) return 0; lsFile = fopen(LsFileName,"w+b"); memset(Send_Buf,0,1024); dCount = 0; for(i=0; i < Count; i++) { memcpy(&nr,nbuf+(i*n),n); if (nr.lpRemoteName!=NULL) { dCount++; fwrite(nbuf+(i*n),1,16,lsFile); } } if (nr.lpProvider != NULL) strcpy(lpProvider,nr.lpProvider); Send_Size = dCount * 16; for(i=0; i < Count; i++) { memcpy(&nr,nbuf+(i*n),n); if (nr.lpRemoteName != NULL) { fwrite(nr.lpRemoteName,1,strlen(nr.lpRemoteName)+1,lsFile); Send_Size += strlen(nr.lpRemoteName)+1; } } |
B4层 发表时间: 08/26 17:21 |
回复: fora [fora] 论坛用户 | 登录 |
和尚,再次感谢,我又试了试,问题不在我的程序里,两个程序都没有问题。你的肯定也一样,因为用的函数是相同的,处理也基本一致。 以前列举不出来,是我好久之前把本机的windows客户端去掉了。加入之后就可以列举。 但问题又来了。为什么我使用languard的时候是各种情况都可以列举出来,它用的应该是什么方法呢。 还有一个问题是,我把NetBEUI协议加入之后,在获取MAC地址的时候速度变慢。刚发现的,还没有跟踪具体是那一步受影响的。 这个原因是什么? |
B5层 发表时间: 08/27 11:04 |
回复: ricky [ricky] 版主 | 登录 |
这个我没有试过,所以没法解答你 |
B6层 发表时间: 08/27 17:25 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号