Décompression de _WTS_CLIENT_ADDRESS.Address dans vb.net (récupération de l'adresse IP du client des services Terminal Server)
-
08-07-2019 - |
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
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.
Autres conseils
La vraie réponse peut être trouvée ici. http: // www. tech-archive.net/Archive/Windows/microsoft.public.windows.terminal_services/2007-03/msg00474.html