Décompression de _WTS_CLIENT_ADDRESS.Address dans vb.net (récupération de l'adresse IP du client des services Terminal Server)

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

Question

J'ai la structure suivante:

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

Qui est rempli par l'appel suivant:

        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)

Le tableau d'octets d'adresse est en cours de remplissage, mais je ne sais pas comment le convertir en chaîne ou en nombre entier utiles. La documentation MDSN est rare: http://msdn.microsoft .com / fr-us / library / aa383857 (VS.85) .aspx

Était-ce utile?

La solution

Vous y êtes presque avec votre code. Je suis d'accord avec vous, le MSDN n'est pas assez explicite sur ce qu'il y a dans ce tableau d'octets, mais voici ce que vous pouvez faire:

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

Les deux premiers octets ne semblent pas être utilisés, mais dans le cas de AF_INET (qui est IPv4 ou 2), les quatre octets suivants sont l'adresse IPv4 du client.

Vous pouvez également vous assurer que votre code gérera correctement IPv6 (AF_INET6) ou que AF_INET6 est une valeur probable. Vous aurez probablement besoin de lire 16 octets au lieu de 4 pour ce protocole.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top