Получение списка DHCP-серверов Windows и информации о каждом DHCP-сервере с использованием .NET

2

Мы делаем небольшую панель инструментов для извлечения и отображения списка DHCP-серверов в локальной сети, а затем получения информации о Scope, как используемых и неиспользуемых IP-адресов, и подсчета с использованием .NET предпочтительно С#. Как это можно сделать возможным.

Теги:
windows-server-2003
dhcp

2 ответа

0

Отличная библиотека функций DHCP - ДИНАМИЧЕСКИЕ ХОЗЯЙСТВЕННЫЕ УСЛУГИ ПО ПРОГРАММИРОВАНИЮ ПРОТОКОЛА Джейсоном Рупардом

У него нет перечисления 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;
    }
}
0

Я попытался сделать что-то подобное один раз (с Windows 2003) и обнаружил, что для DHCP-сервера не было никаких .net-объектов/классов. Я нашел этот http://bytes.com/topic/net/answers/574937-managing-dhcp-servers-using-c-another-net-lang, но это было выше моего уровня кодирования.

Удачи.

  • 0
    Привет, Бен, я посетил этот сайт ранее, просто хотел узнать больше об этом. В любом случае, спасибо!!!
  • 0
    nbtstat -A MICROSOFT_DHCP_SRV_IP

Ещё вопросы

Сообщество Overcoder
Наверх
Меню