⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 module1.bas

📁 可以获取局域网内所有计算机,并且还可以得到相应的IP地址
💻 BAS
字号:
Attribute VB_Name = "Module1"
Private Const RESOURCE_CONNECTED As Long = &H1&

Private Const RESOURCE_GLOBALNET As Long = &H2&

Private Const RESOURCE_REMEMBERED As Long = &H3&

Private Const RESOURCEDISPLAYTYPE_DIRECTORY& = &H9

Private Const RESOURCEDISPLAYTYPE_DOMAIN& = &H1

Private Const RESOURCEDISPLAYTYPE_FILE& = &H4

Private Const RESOURCEDISPLAYTYPE_GENERIC& = &H0

Private Const RESOURCEDISPLAYTYPE_GROUP& = &H5

Private Const RESOURCEDISPLAYTYPE_NETWORK& = &H6

Private Const RESOURCEDISPLAYTYPE_ROOT& = &H7

Private Const RESOURCEDISPLAYTYPE_SERVER& = &H2

Private Const RESOURCEDISPLAYTYPE_SHARE& = &H3

Private Const RESOURCEDISPLAYTYPE_SHAREADMIN& = &H8

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_REAL

  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 WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) 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 Any, lphEnum As Long) As Long

Private Declare Function WNetEnumResource Lib "mpr.dll" Alias "WNetEnumResourceA" (ByVal hEnum As Long, lpcCount As Long, lpBuffer As NETRESOURCE, lpBufferSize As Long) As Long

Private Declare Function WNetCloseEnum Lib "mpr.dll" (ByVal hEnum As Long) As Long

Private Declare Function VarPtrAny Lib "vb40032.dll" Alias "VarPtr" (lpObject As Any) 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 Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Public strUserName As String

Public strMachinerName As String


Private Const SOCKET_ERROR As Long = -1
Private Const MAX_WSADescription = 256
Private Const MAX_WSASYSStatus = 128
Private Const ERROR_SUCCESS       As Long = 0
Private Const WS_VERSION_REQD     As Long = &H101
Private Const MIN_SOCKETS_REQD    As Long = 1
Private Const WS_VERSION_MAJOR    As Long = WS_VERSION_REQD \ &H100 And &HFF&
Private Const WS_VERSION_MINOR    As Long = WS_VERSION_REQD And &HFF&

Private Type HOSTENT
    hName      As Long
    hAliases   As Long
    hAddrType  As Integer
    hLen       As Integer
    hAddrList  As Long
End Type

Private Type WSADATA
    wVersion      As Integer
    wHighVersion  As Integer
    szDescription(0 To MAX_WSADescription)   As Byte
    szSystemStatus(0 To MAX_WSASYSStatus)    As Byte
    wMaxSockets   As Integer
    wMaxUDPDG     As Integer
    dwVendorInfo  As Long
End Type

Private Declare Function gethostname Lib "WSOCK32.DLL" (ByVal szHost As String, ByVal dwHostLen As Long) As Long
Private Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal szHost As String) As Long
Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired As Long, lpWSADATA As WSADATA) As Long
Private Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long
Private Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)


Sub main()

  'KPD-Team 2000

  'URL: http://www.allapi.net/

  'E-Mail: KPDTeam@Allapi.net

  '-> This sample was created by Donald Grover

  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_REAL
  
  Dim IpStr As String

  bFirstTime = True

  Do

    If bFirstTime Then

      lReturn = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_ALL, ByVal 0&, hEnum)

      bFirstTime = False

    Else

      If uNet(lLastIndex).dwUsage And RESOURCEUSAGE_CONTAINER Then

        lReturn = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_ALL, uNet(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_REAL

          For l = 0 To lCount - 1

            'Each Resource will appear here as uNet(i)

            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

            If uNetApi(l).pComment Then

              lLength = lstrlen(uNetApi(l).pComment)

              uNet(lMin + l).sComment = Space$(lLength)

              CopyMem ByVal uNet(lMin + l).sComment, ByVal uNetApi(l).pComment, lLength

            End If

            If uNetApi(l).pProvider Then

              lLength = lstrlen(uNetApi(l).pProvider)

              uNet(lMin + l).sProvider = Space$(lLength)

              CopyMem ByVal uNet(lMin + l).sProvider, ByVal uNetApi(l).pProvider, lLength

            End If

          Next l

        End If

        lMin = lMin + lCount

      Loop While lReturn = ERROR_MORE_DATA

    End If

    If hEnum Then

      l = WNetCloseEnum(hEnum)

    End If

  Loop While lLastIndex < lMin


  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, ""

    Print #filNum, "UserName:   " & strUserName

    Print #filNum, "Computer Name: " & strMachinerName

    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
      
      IpStr = ""
      
      If uNet(l).dwDisplayType = RESOURCEDISPLAYTYPE_SERVER Then
        IpStr = GetIPAddress(Replace(uNet(l).sRemoteName, "\\", ""))
      End If
      
      Debug.Print uNet(l).sRemoteName, uNet(l).sComment, IpStr

      Print #filNum, uNet(l).sRemoteName, uNet(l).sComment, IpStr

    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 Function GetIPAddress(Optional sHost As String) As String
'返回给定机器名的Ip地址,机器名为空时返回本机Ip地址
    Dim sHostName   As String * 256
    Dim lpHost      As Long
    Dim HOST        As HOSTENT
    Dim dwIPAddr    As Long
    Dim tmpIPAddr() As Byte
    Dim i           As Integer
    Dim sIPAddr     As String
    Dim werr        As Long

    If Not SocketsInitialize() Then
        GetIPAddress = ""
        Exit Function
    End If
    
    If sHost = "" Then
        If gethostname(sHostName, 256) = SOCKET_ERROR Then
            werr = WSAGetLastError()
            GetIPAddress = ""
            SocketsCleanup
            Exit Function
        End If

        sHostName = Trim$(sHostName)
    Else
        sHostName = Trim$(sHost) & Chr$(0)
    End If
    
    lpHost = gethostbyname(sHostName)

    If lpHost = 0 Then
        werr = WSAGetLastError()
        GetIPAddress = ""
        SocketsCleanup
        Exit Function
    End If

    CopyMemory HOST, lpHost, Len(HOST)
    CopyMemory dwIPAddr, HOST.hAddrList, 4

    ReDim tmpIPAddr(1 To HOST.hLen)
    CopyMemory tmpIPAddr(1), dwIPAddr, HOST.hLen

    For i = 1 To HOST.hLen
        sIPAddr = sIPAddr & tmpIPAddr(i) & "."
    Next

    GetIPAddress = Mid$(sIPAddr, 1, Len(sIPAddr) - 1)
    SocketsCleanup
End Function

Private Function SocketsInitialize(Optional sErr As String) As Boolean
    Dim WSAD As WSADATA, sLoByte As String, sHiByte As String
    If WSAStartup(WS_VERSION_REQD, WSAD) <> ERROR_SUCCESS Then
        sErr = "The 32-bit Windows Socket is not responding."
        SocketsInitialize = False
        Exit Function
    End If

    If WSAD.wMaxSockets < MIN_SOCKETS_REQD Then
        sErr = "This application requires a minimum of " & _
                CStr(MIN_SOCKETS_REQD) & " supported sockets."

        SocketsInitialize = False
        Exit Function
    End If


    If LoByte(WSAD.wVersion) < WS_VERSION_MAJOR Or _
            (LoByte(WSAD.wVersion) = WS_VERSION_MAJOR And _
            HiByte(WSAD.wVersion) < WS_VERSION_MINOR) Then

        sHiByte = CStr(HiByte(WSAD.wVersion))
        sLoByte = CStr(LoByte(WSAD.wVersion))

        sErr = "Sockets version " & sLoByte & "." & sHiByte & _
                " is not supported by 32-bit Windows Sockets."

        SocketsInitialize = False
        Exit Function
    End If
    SocketsInitialize = True
End Function

Private Sub SocketsCleanup()
    If WSACleanup() <> ERROR_SUCCESS Then
        App.LogEvent "Socket error occurred in Cleanup.", vbLogEventTypeError
    End If
End Sub

Private Function HiByte(ByVal wParam As Integer)
    HiByte = wParam \ &H1 And &HFF&
End Function

Private Function LoByte(ByVal wParam As Integer)
    LoByte = wParam And &HFF&
End Function
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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -