Desempaque _WTS_CLIENT_ADDRESS.Dirección en vb.net (recuperación de la dirección IP del cliente de Terminal Services)

StackOverflow https://stackoverflow.com/questions/288560

Pregunta

Tengo la siguiente estructura:

    <StructLayout(LayoutKind.Sequential)> _
    Public Structure _WTS_CLIENT_ADDRESS
        Public AddressFamily As Integer
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=20)> _
        Public Address() As Byte
    End Structure

Que se completa con la siguiente llamada:

        Dim _ClientIPAddress As New _WTS_CLIENT_ADDRESS
        Dim rtnPtr As IntPtr
        Dim rtncount As Int32

        NativeMethods.WTSQuerySessionInformation(CInt(NativeMethods.WTS_CURRENT_SERVER_HANDLE), NativeMethods.WTS_CURRENT_SESSION, NativeMethods.WTS_INFO_CLASS.WTSClientAddress, rtnPtr, rtncount)
        '_ClientIPAddress()
        _ClientIPAddress = _
            CType(System.Runtime.InteropServices.Marshal.PtrToStructure(rtnPtr, GetType(_WTS_CLIENT_ADDRESS)), _WTS_CLIENT_ADDRESS)

La matriz de bytes de dirección se está rellenando, pero no tengo idea de cómo convertirla en una cadena útil o valores enteros. La documentación de MDSN es escasa: http://msdn.microsoft .com / es-es / biblioteca / aa383857 (VS.85) .aspx

¿Fue útil?

Solución

Ya casi estás allí con tu código. Estoy de acuerdo con usted, el MSDN no es muy explícito sobre lo que hay dentro de esa matriz de bytes, pero esto es lo que puede hacer:

IPAddress address = new IPAddress(_ClientIPAddress.Address.Skip(2).Take(4).ToArray());

Los primeros dos bytes no parecen usarse, pero en el caso de AF_INET (que es IPv4, o 2) los siguientes cuatro bytes son la dirección IPv4 del cliente.

También es posible que desee asegurarse de que su código manejará IPv6 (AF_INET6) correctamente, o manejar el hecho de que AF_INET6 es un valor probable. Probablemente necesitará leer 16 bytes en lugar de 4 para este protocolo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top