我们正在做一个小型仪表板来检索和显示LAN 中的 DHCP 服务器列表,然后获取范围信息,例如使用和未使用的 IP 以及使用 .NET 最好是 C# 的计数。怎么可能做到这一点。
Jagannath Swain
问问题
2196 次
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 回答