【问题标题】:Retrieving Windows DHCP servers list and scope information of each DHCP server using .NET使用 .NET 检索每个 DHCP 服务器的 Windows DHCP 服务器列表和范围信息
【发布时间】:2011-02-17 00:15:00
【问题描述】:

我们正在做一个小型仪表板来检索和显示 LAN 中的 DHCP 服务器列表,然后获取范围信息,例如使用和未使用的 IP 以及使用 .NET 最好是 C# 的计数。怎么可能做到这一点。

【问题讨论】:

    标签: c# .net windows-server-2003 dhcp


    【解决方案1】:

    我曾经尝试做类似的事情(使用 Windows 2003),发现 DHCP 服务器没有任何 .net 对象/类。我确实找到了这个http://bytes.com/topic/net/answers/574937-managing-dhcp-servers-using-c-another-net-lang,但这超出了我的编码水平..

    祝你好运

    【讨论】:

    • 嗨,Ben,我之前访问过这个网站,只是想对此有更多的了解。还是谢谢你!!!
    • nbtstat -A MICROSOFT_DHCP_SRV_IP
    【解决方案2】:

    优秀的 DHCP 函数库 - DYNAMIC HOST CONFIGURATION PROTOCOL WEB SERVICES by Jason Rupard

    他那里没有 DHCP 服务器的枚举,所以我在下面展示了如何这样做。您需要的所有其他东西都应该已经在那里了。

    [DllImport("dhcpsapi.dll", CharSet = CharSet.Unicode)]
    internal static extern UInt32 DhcpEnumServers(
        UInt32 Flags, // Should be 0
        IntPtr IdInfo, // Should be null
        out IntPtr Servers,
        IntPtr CallbackFn, // Should be null
        IntPtr CallbackData // Should be null
        );
    
    [DllImport("dhcpsapi.dll")]
    internal static extern void DhcpRpcFreeMemory(IntPtr BuffPtr);
    
    [StructLayoutAttribute(LayoutKind.Sequential)]
    public struct DHCP_SERVER_INFO_ARRAY
    {
        public UInt32 Flags;
        public UInt32 NumElements;
        public IntPtr Servers;
    }
    
    [StructLayoutAttribute(LayoutKind.Sequential)]
    public struct DHCP_SERVER_INFO
    {
        public UInt32 Version;
        [MarshalAsAttribute(UnmanagedType.LPWStr)]
        public string ServerName;
        public UInt32 ServerAddress;
        public UInt32 Flags;
        public UInt32 State;
        [MarshalAsAttribute(UnmanagedType.LPWStr)]
        public string DsLocation;
        public UInt32 DsLocType;
    }
    
    public class DhcpServer
    {
        public string Name;
        public DhcpIpAddress IpAddress;
        public string AdLocation;
    
        public static List<DhcpServer> EnumAll()
        {
            var servers = new List<DhcpServer>();
            IntPtr retPtr;
            var response = NativeMethods.DhcpEnumServers(0, IntPtr.Zero, out retPtr, IntPtr.Zero, IntPtr.Zero);
    
            if (response != 0)
            {
                if (retPtr != IntPtr.Zero)
                {
                    NativeMethods.DhcpRpcFreeMemory(retPtr);
                }
                throw new DhcpException(response);
            }
            var nativeArray = (DHCP_SERVER_INFO_ARRAY) Marshal.PtrToStructure(retPtr, typeof (DHCP_SERVER_INFO_ARRAY));
            var current = nativeArray.Servers;
            for (var i = 0; i < nativeArray.NumElements; ++i)
            {
                var nativeClient = (DHCP_SERVER_INFO) Marshal.PtrToStructure(current, typeof (DHCP_SERVER_INFO));
                servers.Add(ConvertFromNative(nativeClient));
                current = (IntPtr) ((int) current + Marshal.SizeOf(typeof(DHCP_SERVER_INFO)));
            }
    
            NativeMethods.DhcpRpcFreeMemory(retPtr);
            return servers;
    
        }
    
        private static DhcpServer ConvertFromNative(DHCP_SERVER_INFO nativeServer)
        {
            var server = new DhcpServer
                             {
                                 IpAddress = new DhcpIpAddress(nativeServer.ServerAddress),
                                 Name = nativeServer.ServerName,
                                 AdLocation = nativeServer.DsLocation
                             };
            return server;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 2021-04-24
      相关资源
      最近更新 更多