2

LAN内のDHCPサーバーリストを取得して表示する小さなダッシュボードを作成し、使用済みおよび未使用のIPなどのスコープ情報と、.NET、できればC#を使用したカウントを取得しています。どうすればそれが可能になるでしょうか。

4

2 に答える 2

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 に答える
0

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;
    }
}
于 2013-04-03T00:28:35.560 に答える