如何从 vb6 代码确定登录到 windows 服务器的工作站的 IP 地址

How can I determine IP address of a workstation logged into a windows server from vb6 code

我有一个在网络上运行的多用户 VB6 程序。一些用户在 Windows XP 桌面上,一些用户在使用 RDP 登录到 Windows 2008R2 服务器的瘦客户端上。我有一个新需求,要求我知道局域网用户的IP地址,以及远程用户的IP,或者远程用户的登录信息。我不确定这是否可能。任何帮助或信息将不胜感激。

此 returns 当前 RDP 会话的客户端 IP 地址或在 RDP 会话下未执行时为空字符串。

客户端 IP 地址是 mstsc.exe 在建立连接时报告的客户端计算机的本地 IP 之一,可能与使用 netstat 或类似方法观察到的真实 IP 不同。

Option Explicit

'--- for WTSQuerySessionInformation
Private Const WTS_CURRENT_SERVER_HANDLE             As Long = 0
Private Const WTS_CURRENT_SESSION                   As Long = -1
Private Const WTSClientAddress                      As Long = 14
'--- for AddressFamily
Private Const AF_INET                               As Long = 2

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Private Declare Function WTSQuerySessionInformation Lib "wtsapi32" Alias "WTSQuerySessionInformationA" (ByVal hServer As Long, ByVal SessionId As Long, ByVal WtsInfoClass As Long, ppBuffer As Long, pBytesReturned As Long) As Long
Private Declare Sub WTSFreeMemory Lib "wtsapi32" (ByVal pMemory As Long)

Private Type WTS_CLIENT_ADDRESS
    AddressFamily       As Long
    Address(0 To 19)    As Byte
End Type

Private Function GetSessionClientIp() As String
    Dim uAddress        As WTS_CLIENT_ADDRESS
    Dim lPtr            As Long
    Dim lSize           As Long

    Call WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSClientAddress, lPtr, lSize)
    If lSize >= LenB(uAddress) Then
        Call CopyMemory(uAddress, ByVal lPtr, LenB(uAddress))
    End If
    Call WTSFreeMemory(lPtr)
    If uAddress.AddressFamily = AF_INET Then
        GetSessionClientIp = uAddress.Address(2) & "." & uAddress.Address(3) & "." & uAddress.Address(4) & "." & uAddress.Address(5)
    End If
End Function

Private Sub Form_Load()
    MsgBox "GetSessionClientIp=" & GetSessionClientIp(), vbExclamation
End Sub