Hello,
I'm working on an application to allow our network team to use a small
application to make DHCP reservations on our Microsoft DHCP Server.
The problem is you have to use P/Invoke to do it, and from what I've
found on the web and in this newsgroup is that it's not easy, however I
believe it can/has been done.
At the moment I'm just trying to find out information about an existing
reservation but I'm getting stuck. I read the newsgroup article
'P/Invoke with DHCP management API' which got me started but the last
comment made on 2006-01-01 didn't make sense to me and I can't get the
damn thing to work, in my test console app.
Here is the code I am using, could someone point me in the right
direction please?:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace DHCP
{
class Program
{
static void Main(string[] args)
{
String ServerIpAddress = "192.168.0.250";
UInt32 DHCPResult = 0;
try
{
DhcpApi.DHCP_SEARCH_INFO searchInfo = new
DhcpApi.DHCP_SEARCH_INFO();
DhcpApi.DHCP_SEARCH_INFO_TYPE searchInfoType =
DhcpApi.DHCP_SEARCH_INFO_TYPE.DhcpClientIpAddress;
searchInfo.SearchType = searchInfoType;
searchInfo.ClientIpAddress =
DhcpApi.ConvertIPAddress("192.168.0.5");
DhcpApi.DHCP_CLIENT_INFO clientInfo = new
DhcpApi.DHCP_CLIENT_INFO();
DHCPResult = DhcpApi.DhcpGetClientInfo(ServerIpAddress,
ref searchInfo, ref clientInfo);
Console.WriteLine(DHCPResult.ToString() + " Client
Info: " + clientInfo.ClientName);
}
catch (Exception ex)
{
Console.WriteLine("******************************* *********************************************");
Console.WriteLine("ERROR: \t" + DHCPResult.ToString());
Console.WriteLine("MESSAGE: \t" + ex.Message);
Console.WriteLine();
Console.WriteLine("FULL DETAILS:");
Console.WriteLine(ex.ToString());
Console.WriteLine("******************************* *********************************************");
}
Console.ReadKey(true);
}
}
public class DhcpApi
{
/// <summary>
/// The DhcpGetClientInfo function returns information about a
specific DHCP client.
/// </summary>
/// <param name="ServerIpAddress">[in] Unicode string that
specifies the IP address of the DHCP server.</param>
/// <param name="SearchInfo">[in] DHCP_SEARCH_INFO structure
that contains the parameters for the search. </param>
/// <param name="ClientInfo">[out] Pointer to a
DHCP_CLIENT_INFO structure that contains information describing the DHCP
client that most closely matches the provided search parameters. If no
client is found, this parameter will be null.</param>
/// <returns>This function returns ERROR_SUCCESS upon a
successful call. Otherwise, it returns one of the DHCP Server Management
API Error Codes.</returns>
[DllImport("dhcpsapi.dll", SetLastError = true,CharSet =
CharSet.Unicode)]
public static extern UInt32
DhcpGetClientInfo([MarshalAs(UnmanagedType.LPWStr)]String
ServerIpAddress, ref DHCP_SEARCH_INFO SearchInfo, ref DHCP_CLIENT_INFO
ClientInfo);
/// <summary>
/// The DHCP_SEARCH_INFO_TYPE enumeration defines the set of
possible
/// attributes used to search DHCP client information records.
/// </summary>
public enum DHCP_SEARCH_INFO_TYPE : int
{
/// <summary>
/// The search will be performed against the assigned DHCP
client IP address, represented as a 32-bit unsigned integer value.
/// </summary>
DhcpClientIpAddress = 0,
/// <summary>
/// The search will be performed against the MAC address of
the DHCP client network interface device, represented as a
DHCP_BINARY_DATA structure.
/// </summary>
DhcpClientHardwareAddress = 1,
/// <summary>
/// The search will be performed again the DHCP client's
network name, represented as a Unicode string.
/// </summary>
DhcpClientName = 2
}
/// <summary>
/// The DHCP_SEARCH_INFO structure defines the DHCP client record
/// data used to search against for particular server operations.
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DHCP_SEARCH_INFO
{
// typedef struct _DHCP_CLIENT_SEARCH_INFO {
// DHCP_SEARCH_INFO_TYPE SearchType;
// union {
// DHCP_IP_ADDRESS ClientIpAddress;
// DHCP_CLIENT_UID ClientHardwareAddress;
// LPWSTR ClientName;
// } SearchInfo;
//} DHCP_SEARCH_INFO, *LPDHCP_SEARCH_INFO;
public DHCP_SEARCH_INFO_TYPE SearchType;
public UInt32 ClientIpAddress;
}
/// <summary>
/// The DHCP_CLIENT_INFO structure defines a client information
record
/// used by the DHCP server.
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DHCP_CLIENT_INFO
{
//
************************************************** **************************
// DHCP_IP_ADDRESS Specifies an IP address, with the first
byte containing
// the first number in the address, the second byte
containing the second
// number, the third byte containing the third number, and
the last byte
// containing the last number in the address. For example,
the address
// 192.1.1.10 is represented as 11000000 00000001 00000001
00001010 (binary),
// or 3221291274 (decimal).
//
************************************************** **************************
public UInt32 ClientIpAddress;
public UInt32 SubnetMask;
public DHCP_BINARY_DATA ClientHardwareAddress;
[MarshalAs(UnmanagedType.LPWStr)]
public String ClientName;
[MarshalAs(UnmanagedType.LPWStr)]
public String ClientComment;
public DATE_TIME ClientLeaseExpires;
public DHCP_HOST_INFO OwnerHost;
}
}
}
I'm also hoping to implement the following API functions in the future,
if anyone has any pointers on these as well! ;o):
DhcpGetClientInfo
DhcpDeleteClientInfo
DhcpCreateClientInfo
DhcpSetClientInfo
DhcpEnumSubnetClients
Cheers,
Richard W.
--
Google First. Ask Later.