当前位置:编程学习 > VB >>

如何获取局域网中所有的计算机名称

如何获取局域网中所有计算机名称以及IP地址....
在网络上查找了些代码,运行后获取不到,大家帮忙来看看吧

Private Const RESOURCETYPE_ANY As Long = &H0&
Private Const RESOURCETYPE_DISK As Long = &H1&
Private Const RESOURCETYPE_PRINT As Long = &H2&
Private Const RESOURCETYPE_UNKNOWN As Long = &HFFFF&
Private Const RESOURCEUSAGE_ALL As Long = &H0&
Private Const RESOURCEUSAGE_CONNECTABLE As Long = &H1&
Private Const RESOURCEUSAGE_CONTAINER As Long = &H2&
Private Const RESOURCEUSAGE_RESERVED As Long = &H80000000
Private Const NO_ERROR = 0
Private Const ERROR_MORE_DATA = 234 'l // dderror
Private Const RESOURCE_ENUM_ALL As Long = &HFFFF

Private Type NETRESOURCE
        dwScope As Long
        dwType As Long
        dwDisplayType As Long
        dwUsage As Long
        pLocalName As Long
        pRemoteName As Long
        pComment As Long
        pProvider As Long
End Type

Private Type Netresource_BUf
         dwScope As Long
         dwType As Long
         dwDisplayType As Long
         dwUsage As Long
         sLocalName As String
         sRemoteName As String
         sComment As String
         sProvider As String
End Type

Private Declare Function WNetAddConnection Lib "mpr.dll" Alias "WNetAddConnectionA" (ByVal lpszNetPath As String, ByVal lpszPassword As String, ByVal lpszLocalName As String) As Long
Private 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
Private Declare Function WNetEnumResource Lib "mpr.dll" Alias "WNetEnumResourceA" (ByVal hEnum As Long, lpcCount As Long, lpBuffer As Any, lpBufferSize As Long) As Long
Private Declare Function WNetCloseEnum Lib "mpr.dll" (ByVal hEnum As Long) As Long
Private Declare Function ValidateRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long) As Long
Private Declare Sub CopyMem Lib "kernel32" Alias "rtlmovememory" (lpTo As Any, lpFrom As Any, ByVal lLen As Long)
Private Declare Sub CopyMemByPtr Lib "kernel32" Alias "rtlmovememory" (ByVal lpTo As Long, ByVal lpFrom As Long, ByVal lLen As Long)
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpya" (ByVal lpString1 As String, ByVal lpString2 As Any) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlena" (ByVal lpString As Any) As Long
Private Declare Function getusername Lib "advapi32.dll " Alias "GetUserNameA " (ByVal lpBuffer As String, nSize As Long) As Long

Private Sub Form_Load()
On Error Resume Next
Const MAX_RESOURCES = 256
Const NOT_A_CONTAINER = -1
Dim bFirstTime As Boolean
Dim lReturn As Long
Dim hEnum As Long
Dim lCount As Long
Dim lMin As Long
Dim lLength As Long
Dim l As Long
Dim lBufferSize As Long
Dim lLastIndex As Long
Dim uNetApi(0 To MAX_RESOURCES) As NETRESOURCE
Dim uNet() As Netresource_BUf
bFirstTime = True

Do
   If bFirstTime Then
      lReturn = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_ALL, uNetApi(0), hEnum)
      bFirstTime = False
      Else
          If uNet(lLastIndex).dwUsage And RESOURCEUSAGE_CONTAINER Then
             lReturn = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_ALL, uNetApi(lLastIndex), hEnum)
             Else
                lReturn = NOT_A_CONTAINER
                hEnum = 0
          End If
      lLastIndex = lLastIndex + 1
   End If
    
   If lReturn = NO_ERROR Then
      lCount = RESOURCE_ENUM_ALL
      Do
        lBufferSize = UBound(uNetApi) * Len(uNetApi(0)) / 2
        lReturn = WNetEnumResource(hEnum, lCount, uNetApi(0), lBufferSize)
       If lCount > 0 Then
          ReDim Preserve uNet(0 To lMin + lCount - 1) As Netresource_BUf   '以前是netresourece
          For l = 0 To lCount - 1
              uNet(lMin + l).dwScope = uNetApi(l).dwScope
              uNet(lMin + l).dwType = uNetApi(l).dwType
              uNet(lMin + l).dwDisplayType = uNetApi(l).dwDisplayType
              uNet(lMin + l).dwUsage = uNetApi(l).dwUsage
              If uNetApi(l).pLocalName Then
                 lLength = lstrlen(uNetApi(l).pLocalName)
                 uNet(lMin + l).sLocalName = Space$(lLength)
                 CopyMem ByVal uNet(lMin + l).sLocalName, ByVal uNetApi(l).pLocalName, lLength
              End If
               
              If uNetApi(l).pRemoteName Then
                 lLength = lstrlen(uNetApi(l).pRemoteName)
                 uNet(lMin + l).sRemoteName = Space$(lLength)
                 CopyMem ByVal uNet(lMin + l).sRemoteName, ByVal uNetApi(l).pRemoteName, lLength
              End If
         Next l
       End If
       lMin = lMin + lCount
     Loop While lReturn = ERROR_MORE_DATA
   End If
   If hEnum Then l = WNetCloseEnum(hEnum)
Loop While lLastIndex < lMin


'If UBound(uNet) > 0 Then
'    For l = 0 To UBound(uNet)
'        If uNet(l).dwDisplayType = RESOURCEDISPLAYTYPE_SERVER Then List1.AddItem uNet(l).sRemoteName
'    Next l
'End If

If UBound(uNet) > 0 Then
                username
                Dim filNum     As Integer
                filNum = FreeFile
                Open App.Path & "\ " & LCase(App.EXEName) & ".txt " For Output Shared As #filNum
                'Open   "d:\ "   &   App.EXEName   &   ".txt "   For   Output   Shared   As   #filNum
                Print #filNum, "Date:   " & Format(Now, "Long   date ")
                Print #filNum, "UserName:             " & strUserName
                Print #filNum, "ComputerName:   " & strMachinerName
                Print UBound(uNet)
                For l = 0 To UBound(uNet)
                        Select Case uNet(l).dwDisplayType
                                Case RESOURCEDISPLAYTYPE_DIRECTORY&
                                        Debug.Print "Directory... ",
                                        Print #filNum, "Directory... ",
                                Case RESOURCEDISPLAYTYPE_DOMAIN
                                        Debug.Print "Domain... ",
                                        Print #filNum, "Domain... ",
                                Case RESOURCEDISPLAYTYPE_FILE
                                        Debug.Print "File... ",
                                        Print #filNum, "File... ",
                                Case RESOURCEDISPLAYTYPE_GENERIC
                                        Debug.Print "Generic... ",
                                        Print #filNum, "Generic... ",
                                Case RESOURCEDISPLAYTYPE_GROUP
                                        Debug.Print "Group... ",
                                        Print #filNum, "Group... ",
                                Case RESOURCEDISPLAYTYPE_NETWORK&
                                        Debug.Print "Network... ",
                                        Print #filNum, "Network... ",
                                Case RESOURCEDISPLAYTYPE_ROOT&
                                        Debug.Print "Root... ",
                                        Print #filNum, "Root... ",
                                Case RESOURCEDISPLAYTYPE_SERVER
                                        Debug.Print "Server... ",
                                        Print #filNum, "Server... ",
                                Case RESOURCEDISPLAYTYPE_SHARE
                                        Debug.Print "Share... ",
                                        Print #filNum, "Share... ",
                                Case RESOURCEDISPLAYTYPE_SHAREADMIN&
                                        Debug.Print "ShareAdmin... ",
                                        Print #filNum, "ShareAdmin... ",
                        End Select
                        Debug.Print uNet(l).sRemoteName, uNet(l).sComment
                        Print #filNum, uNet(l).sRemoteName, uNet(l).sComment
                Next l
        End If
        Close #filNum
      '  MsgBox "File   " + App.Path & "\ " & LCase(App.EXEName) & ".txt   created " + vbCrLf + "Open   it   in   a   text   editor   to   see   the   results ", vbInformation


End Sub

Private Sub username()
    On Error Resume Next
        'Create   a   buffer
        strUserName = String(255, Chr$(0))
        'Get   the   username
        getusername strUserName, 255
        'strip   the   rest   of   the   buffer
        strUserName = Left$(strUserName, InStr(strUserName, Chr$(0)) - 1)
          'Create   a   buffer
        strMachinerName = String(255, Chr$(0))
        GetComputerName strMachinerName, 255
        'remove   the   unnecessary   chr$(0) 's
        strMachinerName = Left$(strMachinerName, InStr(1, strMachinerName, Chr$(0)) - 1)
End Sub

--------------------编程问答-------------------- 肯定不是干什么好事 --------------------编程问答--------------------
引用 1 楼 dbcontrols 的回复:
肯定不是干什么好事

晕,是公司要做个局域网内的通信,用到UDP不过udp.RemoteHost是输入IP,而boss说想用计算机名来代替显 --------------------编程问答-------------------- 完全没有必要检测,既然是C/S架构,名字由客户端连接时提供给服务器就行了 --------------------编程问答-------------------- 所以说嘛,干坏事就算了,撒谎就太可恶了

引用 3 楼 andy95800 的回复:
完全没有必要检测,既然是C/S架构,名字由客户端连接时提供给服务器就行了
--------------------编程问答--------------------
引用 4 楼 dbcontrols 的回复:
所以说嘛,干坏事就算了,撒谎就太可恶了


引用 3 楼 andy95800 的回复:
完全没有必要检测,既然是C/S架构,名字由客户端连接时提供给服务器就行了


B4下,你很无聊很无趣.... --------------------编程问答-------------------- 话说楼主结贴率挺高的。 --------------------编程问答-------------------- 你代码忘记贴一个getcomputername的api函数,而且似乎是获取本机的?
补充:VB ,  网络编程
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,