如何得到当前域中所有计算机的中文名称及其备注??

xiaohuangtao 2005-03-17 09:25:30
如何得到当前域中所有计算机的中文名称及其备注??
...全文
98 点赞 收藏 4
写回复
4 条回复
xiaohuangtao 2005年03月17日
你的意思是先调用 enumDomain ,再调用 枚举计算机吧??
我实际上也是这样做的,enumDomain 后,域数组有值,传入随便一个域INDEX,都无法枚举!

能否测试一下??
回复 点赞
of123 2005年03月17日
你是没有填充域名,就直接搜索计算机了吧?不存在的域何来计算机?
回复 点赞
xiaohuangtao 2005年03月17日
楼上的兄弟:
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

无论我传0,1,2等参数,ret1>0,就退出了,无法得到计算机名称
回复 点赞
of123 2005年03月17日
注意一下双字节的处理就行了。

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数组的长度。如缓冲区不够大,则设为需要的缓冲区长度
'返回值 类型为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 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

回复 点赞
发动态
发帖子
网络编程
创建于2007-09-28

1145

社区成员

1.8w+

社区内容

VB 网络编程
社区公告
暂无公告