首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#如何获取运行远程应用程序的虚拟ip

C#如何获取运行远程应用程序的虚拟ip
EN

Stack Overflow用户
提问于 2017-06-30 05:22:31
回答 2查看 805关注 0票数 0

我正在w2008r2上运行一个远程应用程序,并希望检索运行该应用程序的虚拟ip。我已经尝试了cassia,但它给了我客户端ip,而不是dhcp服务器分发的ip。通过dns查找地址也不起作用;它返回服务器的IP地址,而不是虚拟IP地址

我已经按照here的说明为每个程序设置了远程桌面IP虚拟化

EN

回答 2

Stack Overflow用户

发布于 2017-06-30 18:57:09

似乎我用WTS_INFO_CLASS --> WTSSessionAddressV4得到了我需要的结果

以及来自的解决方案(缺少WTS_INFO_CLASS上的完整枚举)

代码语言:javascript
复制
using System;
using PreEmptive.SoSAttributes;
using Cassia;
using System.Runtime.InteropServices;
using System.Net;

Namespace SomeNameSpace
{
    internal static class SomeProgram
    {
        //Check if we have a virtual IP address
        TerminalSessionInfo SessionInfo = TermServicesManager.GetSessionInfo(Dns.GetHostName(), _manager.CurrentSession.SessionId);

        string LocalIPAddress = "127.0.0.1";
        if (SessionInfo.ClientAddress != null)
        {
                LocalIPAddress = SessionInfo.ClientAddress;
        }
        MessageBox.Show(LocalIPAddress);
    }

    #region Get TerminalServer info
    public class TermServicesManager
    {

        [DllImport("wtsapi32.dll")]
        static extern IntPtr WTSOpenServer([MarshalAs(UnmanagedType.LPStr)] String pServerName);

        [DllImport("wtsapi32.dll")]
        static extern void WTSCloseServer(IntPtr hServer);

        [DllImport("Wtsapi32.dll")]
        public static extern bool WTSQuerySessionInformation(IntPtr hServer, int sessionId, WTS_INFO_CLASS wtsInfoClass,out System.IntPtr ppBuffer, out uint pBytesReturned);

        [DllImport("wtsapi32.dll")]
        static extern void WTSFreeMemory(IntPtr pMemory);

        [StructLayout(LayoutKind.Sequential)]
        public struct WTS_SESSION_ADDRESS
        {
            public uint AddressFamily;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
            public byte[] Address;
        }

        public enum WTS_INFO_CLASS
        {
            InitialProgram = 0,
            ApplicationName = 1,
            WorkingDirectory = 2,
            OEMId = 3,
            SessionId = 4,
            UserName = 5,
            WinStationName = 6,
            DomainName = 7,
            ConnectState = 8,
            ClientBuildNumber = 9,
            ClientName = 10,
            ClientDirectory = 11,
            ClientProductId = 12,
            ClientHardwareId = 13,
            ClientAddress = 14,
            ClientDisplay = 15,
            ClientProtocolType = 16,
            WTSIdleTime = 17,
            WTSLogonTime = 18,
            WTSIncomingBytes = 19,
            WTSOutgoingBytes = 20,
            WTSIncomingFrames = 21,
            WTSOutgoingFrames = 22,
            WTSClientInfo = 23,
            WTSSessionInfo = 24,
            WTSSessionInfoEx = 25,
            WTSConfigInfo = 26,
            WTSValidationInfo = 27,
            WTSSessionAddressV4 = 28,
            WTSIsRemoteSession = 29
        }

        private static IntPtr OpenServer(string Name)
        {
            IntPtr server = WTSOpenServer(Name);
            return server;
        }

        private static void CloseServer(IntPtr ServerHandle)
        {
            WTSCloseServer(ServerHandle);
        }

        public static TerminalSessionInfo GetSessionInfo(string ServerName, int SessionId)
        {
            IntPtr server = IntPtr.Zero;
            server = OpenServer(ServerName);
            System.IntPtr buffer = IntPtr.Zero;
            uint bytesReturned;
            TerminalSessionInfo data = new TerminalSessionInfo();

            try
            {
                bool worked = WTSQuerySessionInformation(server, SessionId,
                    WTS_INFO_CLASS.WTSSessionAddressV4, out buffer, out bytesReturned);

                if (!worked)
                    return data;

                WTS_SESSION_ADDRESS si = (WTS_SESSION_ADDRESS)Marshal.PtrToStructure((System.IntPtr)buffer, typeof(WTS_SESSION_ADDRESS));
                data.ClientAddress = si.Address[2] + "." +si.Address[3] + "." + si.Address[4] + "." + si.Address[5];

            }
            finally
            {
                WTSFreeMemory(buffer);
                buffer = IntPtr.Zero;
                CloseServer(server);
            }

            return data;
        }

    }

    public class TerminalSessionInfo
    {
        public string ClientAddress;
    }
}
#endregion
票数 1
EN

Stack Overflow用户

发布于 2017-06-30 11:09:45

你的意思是你想要获取本地IP,对吗?如果是,下面是如何做到这一点的:

代码语言:javascript
复制
public static string GetLocalIPAddress()
{
    var host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (var ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork)
        {
            return ip.ToString();
        }
    }

    throw new Exception("Local IP Address Not Found!");
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44835198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档