论坛: 原创软件 标题: 再请大家帮忙,挺急的,:( 复制本贴地址    
作者: 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号