2

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

4

2 回答 2

0

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

他那里没有 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;
    }
}
于 2013-04-03T00:28:35.560 回答
0

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

祝你好运

于 2010-02-08T11:30:26.860 回答