RT.

解决方案 »

  1.   

    mac地址估计只能取到本地的吧?
      

  2.   

    1)枚举计算机
    shell "cmd.exe /c net view > C:\temp\1.txt"
    2)逐行读取 C:\temp\1.txt,用里面的机器名调用
    shell "cmd.exe /c ping 机器名 >> C:\temp\2.txt"
    3)全部 ping 过后调用
    shell "cmd.exe /c arp -a > C:\temp\3.txt"
    4)从 2.txt 中取得机器名和 ip 的对应;
      从 3.txt 中取得 ip 和 mac 的对应。
      

  3.   

    '*****作者:小聪明   [email protected]   
      '*****作者主页:http://coolzm.533.net       http://go.163.com/~coolzm   
      '*****如要转载请保留所有注释信息*****   
      Declare   Function   WNetOpenEnum   Lib   "mpr.dll"   Alias   "WNetOpenEnumA"   (ByVal   dwScope   As   Long,   ByVal   dwType   As   Long,   ByVal   dwUsage   As   Long,   lpNetResource   As   NETRESOURCE,   lphEnum   As   Long)   As   Long   
      '***函数说明:WNetOpenEnum   
      '功能:启动对网络资源进行枚举的过程。这个函数会返回由WNetEnumResource函数用于枚举资源所用的一个句柄   
      '参数         类型     说明   
      'dwScope   Long     指定要枚举的资源范围。可设为下述常数之一:   
      '                             RESOURCE_CONNECTED   枚举已连接的资源(忽略dwUsage)   
      '                             RESOURCE_GLOBALNET   枚举所有资源   
      '                             RESOURCE_REMEMBERED   只枚举永久性连接   
      'dwType     Long     下述常数之一   
      '                             RESOURCE_ANY   枚举所有类型的网络资源   
      '                             RESOURCE_DISK   枚举磁盘资源   
      '                             RESOURCE_PRINT   枚举打印资源   
      'dwUsage   Long     可设为零,表示枚举所有资源;或设为下述常数的一个或两个:   
      '                             RESOURCEUSAGE_CONNECTABLE   只枚举那些能够连接的资源   
      '                             RESOURCEUSAGE_CONTAINER   只枚举包含了其他资源的资源   
      'lpNetResource   NETRESOURCE   这个结构指定了一个容器资源。该函数会枚举包含于这里指定的某个指定资源内的资源。如设为NULL(把声明变成ByVal   As   Long),那么函数会枚举顶级网络资源。倘若在dwScope参数里没有指定RESOURCE_GLOBALNET,那么必须为NULL   
      'lphEnum   Long     指定一个变量,用于装载一个枚举句柄。该句柄由WNetEnumResource函数使用。必须用WNetCloseEnum函数将其清除   
      '返回值     类型为Long     零表示成功   
      Declare   Function   WNetEnumResource   Lib   "mpr.dll"   Alias   "WNetEnumResourceA"   (ByVal   hEnum   As   Long,   lpcCount   As   Long,   lpBuffer   As   Any,   lpBufferSize   As   Long)   As   Long   
      '***函数说明:WNetEnumResource   
      '功能:对网络资源进行枚举,需要WNetOpenEnum传递过来的参数   
      '参数             类型         说明   
      'hEnum           Long         从WNetOpenEnum函数返回的一个句柄   
      'lpcCount     Long         最初设为要枚举的最大资源数量;或设为-1,表示枚举尽可能多的资源。一旦返回,就会设为实际枚举的资源数量   
      '                                     注意:此参数在此次操作结束后将自动设置为枚举的资源的数量,下面用到此项功能   
      'lpBuffer     Any           通常是一个字节缓冲区的首字节。该缓冲区装载了枚举信息(可按引用声明为Byte)   
      'lpBufferSize   Long   以字节为单位指定lpBuffer数组的长度。如缓冲区不够大,则设为需要的缓冲区长度   
      '                                     我在后面的应用中都将此参数设为1024,这样可能在某些时候(例如域或计算机有很多)会丢失一些数据,这里我偷一个小懒,让大家自己解决吧   
      '返回值     类型为Long     零表示成功   
      Declare   Function   WNetCloseEnum   Lib   "mpr.dll"   (ByVal   hEnum   As   Long)   As   Long   
      '***函数说明:WNetCloseEnum   
      '功能:结束枚举操作,需要WNetOpenEnum传递过来的参数   
      '参数             类型         说明   
      'hEnum           Long         从WNetOpenEnum函数返回的一个句柄   
      '返回值     类型为Long     零表示成功   
      Type   NETRESOURCE   
      dwScope   As   Long   
      dwType   As   Long   
      dwDisplayType   As   Long   
      dwUsage   As   Long   
      lpLocalName   As   String   
      lpRemoteName   As   String   
      lpComment   As   String   
      lpProvider   As   String   
      End   Type   
      Public   Const   RESOURCE_GLOBALNET   As   Long   =   &H2&   '用在WNetOpenEnum中的第一个参数,表示要枚举所有网络资源(包括已连接的和未连接的)   
      Public   Const   RESOURCETYPE_ANY   =   &H0   '用在WNetOpenEnum中的第二个参数,表示要枚举所有资源(包括磁盘和打印机)   
      Public   Const   RESOURCETYPE_DISK   =   &H1   '用在WNetOpenEnum中的第二个参数,表示要枚举所有磁盘(文件夹)资源   
      Public   Const   RESOURCETYPE_PRINT   =   &H2   '用在WNetOpenEnum中的第二个参数,表示要枚举所有打印设备资源   
      Public   domainArr()   As   String   '域(Domain)名数组   
      Public   numOfDomain   As   Integer   '域(Domain)的个数   
      Public   comArr()   As   String   '计算机名数组   
      Public   maxNumOfCom   As   Integer   '某个域中计算机的最大数目   
      Public   folderArr()   As   String   '共享文件夹数组   
      Public   maxNumOfFolder   As   Integer   '某个计算机中文件夹的最大数目   
      Public   printArr()   As   String   '打印机数组   
      '**枚举网络资源中所有的域(Domain)**   所有的域名放到数组domainArr中   
      Public   Function   enumDomain()   As   Boolean   
      Dim   ret1   As   Long   
      Dim   ret2   As   Long   
      Dim   hEnum   As   Long   '需要从WNetOpenEnum传递给WNetEnumResource的句柄   
      Dim   maxNum   As   Long   
      Dim   netRes   As   NETRESOURCE   
      Dim   netByte(1024)   As   Byte   
      Dim   tmpStr   As   String   
      Dim   iCount   As   Integer   
      iCount   =   0   
      maxNum   =   -1   
      '此处WNetOpenEnum中第四个参数netRes为空,表示枚举顶级资源,也就是域(Domain)   
      ret1   =   WNetOpenEnum(RESOURCE_GLOBALNET,   RESOURCETYPE_ANY,   0,   netRes,   hEnum)   
      If   ret1   <>   0   Then   
        enumDomain   =   False   
        Exit   Function   
      End   If   
      '将枚举的数据读入缓冲区   
      '注意:读到缓冲区内的数据是真实数据的ASCII码,应当用Chr函数进行转换,注意下面汉字的处理   
      ret2   =   WNetEnumResource(hEnum,   maxNum,   netByte(0),   1024)   
      If   ret1   <>   0   Then   
        enumDomain   =   False   
        Exit   Function   
      End   If   
      Call   WNetCloseEnum(hEnum)   
      '对缓冲区内的数据进行处理:   
        For   i   =   200   To   1023   '头200个字节是些无用的字符(我不知道这些字符是做什么用的)   
          If   netByte(i)   =   "0"   Then   
            If   tmpStr   <>   ""   Then   
              If   tmpStr   <>   "Microsoft   Network"   Then   '缓冲区中会有“Microsoft   Network”字样,没有用,去掉   
                    ReDim   Preserve   domainArr(iCount   +   1)   As   String   '定义动态数组   
                    domainArr(iCount)   =   tmpStr   
                    iCount   =   iCount   +   1   
              End   If   
            End   If   
                    tmpStr   =   ""   
          Else   
            If   Val(netByte(i))   >   122   Then   '域名是中文时   
            '注意:汉字在缓冲区内占两个字节,用如下的形式表示:   
            '             例如:   张   213   197   
                tmpStr   =   tmpStr   &   Chr(Val(netByte(i))   *   256   +   Val(netByte(i   +   1)))   
                i   =   i   +   1   '汉字是双字节   
            Else   
                tmpStr   =   tmpStr   &   Chr(Val(netByte(i)))   
            End   If   
          End   If   
        Next   i   
        numOfDomain   =   maxNum   
        ReDim   Preserve   comArr(numOfDomain,   1)   As   String   
        enumDomain   =   True   
      End   Function   
      '****枚举所有的计算机*****   
      Public   Function   enumAllComputer()   As   Boolean   
      Dim   i   As   Integer   
        For   i   =   0   To   numOfDomain   -   1   
            If   enumComputer(i)   =   False   Then   
                enumAllComputer   =   False   
                Exit   Function   
            End   If   
        Next   i   
        enumAllComputer   =   True   
      End   Function   
        
      '****枚举某个域中所有的计算机*****   
      Public   Function   enumComputer(indexOfDomain   As   Integer)   As   Boolean   
      Dim   ret1   As   Long   
      Dim   ret2   As   Long   
      Dim   hEnum   As   Long   '需要从WNetOpenEnum传递给WNetEnumResource的句柄   
      Dim   maxNum   As   Long   
      Dim   netRes   As   NETRESOURCE   
      Dim   tmpStr   As   String   
      Dim   iCount   As   Integer   
      maxNum   =   -1   
      Dim   netByte(1024)   As   Byte   
      '要枚举某个域中的计算机,需要将参数netRes的属性lpRemoteName设为域的名称   
      netRes.lpRemoteName   =   domainArr(indexOfDomain)   
      ret1   =   WNetOpenEnum(RESOURCE_GLOBALNET,   RESOURCETYPE_ANY,   0,   netRes,   hEnum)   
      DoEvents   
      If   ret1   <>   0   Then   
        enumComputer   =   False   
        Exit   Function   
      End   If   
      ret2   =   WNetEnumResource(hEnum,   maxNum,   netByte(0),   1024)   
      DoEvents   
      If   maxNum   >   maxNumOfCom   Then   
        maxNumOfCom   =   maxNum   
        ReDim   Preserve   comArr(numOfDomain,   maxNumOfCom)   As   String   
      End   If   
      If   ret1   <>   0   Then   
        enumComputer   =   False   
        Exit   Function   
      End   If   
      Call   WNetCloseEnum(hEnum)   
      iCount   =   0   
        For   i   =   200   To   1024   
          If   netByte(i)   =   "0"   Then   
            If   tmpStr   <>   ""   Then   
              If   tmpStr   <>   "Microsoft   Network"   Then   
                      If   Left(tmpStr,   2)   =   "\\"   Then   
                    comArr(indexOfDomain,   iCount)   =   Right(tmpStr,   Len(tmpStr)   -   2)   '   
                    iCount   =   iCount   +   1   
                    End   If   
              End   If   
            End   If   
                    tmpStr   =   ""   
          Else   
            If   Val(netByte(i))   >   122   Then   '计算机名是中文时   
                tmpStr   =   tmpStr   &   Chr(Val(netByte(i))   *   256   +   Val(netByte(i   +   1)))   
                i   =   i   +   1   '汉字是双字节   
            Else   
                tmpStr   =   tmpStr   &   Chr(Val(netByte(i)))   
            End   If   
          End   If   
        Next   i   
      enumComputer   =   True   
      End   Function   
      

  4.   

    jhone99本来是正解,我在网上也看到了,不过代码看起来太复杂了,所以没采纳,谢谢各位。
      

  5.   

    jone99 这个好像采用的是vb6吧,!那vb.net 又该怎么实现呢?且局域网的文件夹可以实现吗?