Disimballaggio di _WTS_CLIENT_ADDRESS.Address in vb.net (recupero dell'indirizzo IP dal client di Servizi terminal)
-
08-07-2019 - |
Domanda
Ho la seguente struttura:
<StructLayout(LayoutKind.Sequential)> _
Public Structure _WTS_CLIENT_ADDRESS
Public AddressFamily As Integer
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=20)> _
Public Address() As Byte
End Structure
Che viene popolato dalla seguente chiamata:
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)
L'array di byte di indirizzi viene popolato, ma non ho idea di come convertirlo in una stringa utile o in valori interi. La documentazione MDSN è scarsa: http://msdn.microsoft .com / it-it / library / aa383857 (VS.85) aspx
Soluzione
Sei quasi arrivato con il tuo codice. Sono d'accordo con te, l'MSDN non è abbastanza esplicito su cosa c'è dentro quell'array di byte, ma ecco cosa puoi fare:
IPAddress address = new IPAddress(_ClientIPAddress.Address.Skip(2).Take(4).ToArray());
I primi due byte non sembrano essere utilizzati, ma nel caso di AF_INET (che è IPv4 o 2) i successivi quattro byte sono l'indirizzo IPv4 del client.
Puoi anche assicurarti che il tuo codice gestirà correttamente IPv6 (AF_INET6) o che AF_INET6 sia un valore probabile. Probabilmente dovrai leggere 16 byte anziché 4 per questo protocollo.
Altri suggerimenti
La vera risposta può essere trovata qui. http: // www. tech-archive.net/Archive/Windows/microsoft.public.windows.terminal_services/2007-03/msg00474.html