有一个局域网,地址是动态分配的,我在服务器上,如何能够遍历所有的计算机呢
谢谢各位大虾

解决方案 »

  1.   

    '*****作者:小聪明 [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
      

  2.   

    '****枚举某个计算机中所有的文件夹和打印机*****
    Public Function enumAllRes() As Boolean
    Dim i As Integer
    Dim j As Integer
    For i = 0 To numOfDomain
      For j = 0 To maxNumOfCom
        If comArr(i, j) <> "" Then
          If enumFolder(i, j) = False Then
            enumAllRes = False
            Exit Function
          End If
          If enumPrinter(i, j) = False Then
            enumAllRes = False
            Exit Function
          End If
         End If
      Next j
    Next i
    enumAllRes = True
    End Function
    '****枚举某个计算机中所有的文件夹*****
    Public Function enumFolder(indexOfDomain As Integer, indexOfCom 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 = "\\" & comArr(indexOfDomain, indexOfCom)
    ret1 = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, netRes, hEnum)
    DoEvents
    If ret1 <> 0 Then
     enumFolder = False
     Exit Function
    End If
    ret2 = WNetEnumResource(hEnum, maxNum, netByte(0), 1024)
    DoEvents
    If maxNum > maxNumOfFolder Then
     maxNumOfFolder = maxNum
     ReDim Preserve folderArr(numOfDomain, maxNumOfCom, maxNumOfFolder) As String
    End If
    If ret1 <> 0 Then
     enumFolder = 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, Len(comArr(indexOfDomain, indexOfCom)) + 2) = "\\" & comArr(indexOfDomain, indexOfCom) Then
             folderArr(indexOfDomain, indexOfCom, iCount) = Right(tmpStr, Len(tmpStr) - 3 - Len(comArr(indexOfDomain, indexOfCom)))
             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
    enumFolder = True
    End Function
    '****枚举某个计算机中所有的打印机*****
    Public Function enumPrinter(indexOfDomain As Integer, indexOfCom 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 = "\\" & comArr(indexOfDomain, indexOfCom)
    ret1 = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_PRINT, 0, netRes, hEnum)
    DoEvents
    If ret1 <> 0 Then
     enumPrinter = False
     Exit Function
    End If
    ret2 = WNetEnumResource(hEnum, maxNum, netByte(0), 1024)
    DoEvents
     ReDim Preserve printArr(numOfDomain, maxNumOfCom, 1) As String '假设一个计算机只能安装一个打印机
    If ret1 <> 0 Then
     enumPrinter = 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
           printArr(indexOfDomain, indexOfCom, iCount) = Right(tmpStr, Len(tmpStr) - 3 - Len(comArr(indexOfDomain, indexOfCom)))
           iCount = iCount + 1
        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
    enumPrinter = True
    End Function
      

  3.   

    of123():
         你好!
        你这些都是什么时候学得呀?需要多长时间?我也想学。有什么好的学习方法和资料么?谢谢。我是天津人,[email protected]   希望能不吝指教!