Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / .NET Framework / New Users / December 2007

Tip: Looking for answers? Try searching our database.

Query DHCP via WMI via C#?

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
coconet - 21 Dec 2007 16:16 GMT
I would like to see a .NET Framework 3.5 or 2.0 example of how to
query the DHCP server using WMI to list all current clients and lease
begin and end datetimes. I want to make a simple web page that shows
this information.

Thanks.
Jeffrey Tan[MSFT] - 24 Dec 2007 08:19 GMT
Hi Coconet ,

As I know, DHCP doesn't support WMI interface for query, we'd better use
DHCP API to query these information. However, I did not find any C# or .Net
code for this task yet. Below is the detailed C++ code using DHCP API to
obtain these information, you have to perform p/invoke to use it in C#:

// sss.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include "stdafx.h"
#include <windows.h>
#include "Winsock2.h"
#include <dhcpsapi.h> /* Please link dhcpsapi.lib to the project. */

DWORD
DhcpDottedStringToIpAddress(
LPSTR String
)
/*++

Routine Description:
This functions converts a dotted decimal form ASCII string to a
Host order IP address.

Arguments:
String - The address to convert.

Return Value:
The corresponding IP address.

--*/
{
struct in_addr addr;

addr.s_addr = inet_addr( String );
return( ntohl(*(LPDWORD)&addr) );
}

LPSTR
DhcpIpAddressToDottedString(
DWORD IpAddress
)
/*++

Routine Description:

This functions converts a Host order IP address to a dotted decimal
form ASCII string.

Arguments:

IpAddress - Host order IP Address.

Return Value:

String for IP Address.

--*/
{
DWORD NetworkOrderIpAddress;

NetworkOrderIpAddress = htonl(IpAddress);
return(inet_ntoa( *(struct in_addr *)&NetworkOrderIpAddress));
}

int main(int argc, char *argv[])
{
DWORD dwMajor, dwMinor;
DWORD nRet;
LPDHCP_CLIENT_INFO_ARRAY clinfo;
DWORD subnet_ip;
char subnet_ip1[128];
DHCP_RESUME_HANDLE handle = NULL;
DWORD read = 0, total = 0;

if(argc <2)
{
printf (" Please input the DHCP server IP \n");
printf (" for example: sss.exe 192.168.1.1 \n");
return 0;
}

WCHAR GlobalServerIpAddressUnicodeString[256];

MultiByteToWideChar( CP_ACP, 0, argv[1],
strlen(argv[1])+1, GlobalServerIpAddressUnicodeString,

sizeof(GlobalServerIpAddressUnicodeString)/sizeof(GlobalServerIpAddressUnico
deString
[0]) );

nRet = DhcpGetVersion(GlobalServerIpAddressUnicodeString, &dwMajor,
&dwMinor);
if ( nRet == ERROR_SUCCESS )
{
}
else
{
printf("\nDhcpGetVersion() error = %d", nRet);
return 1;
}
/* The argv[1] must be Unicode string that specifies the IP address of the
DHCP
server. */

DWORD dwError = ERROR_MORE_DATA;
DWORD dwElementsRead = 0, dwElementsTotal = 0;
LPDHCP_IP_ARRAY pdhcpIpArray = NULL;
DWORD m_dwPreferredMax = 0xFFFFFFFF;
DHCP_RESUME_HANDLE m_dhcpResumeHandle = NULL;
SYSTEMTIME SystemTime;
FILETIME LocalTime;
//
// for this server, enumerate all of it's subnets
//
while (dwError == ERROR_MORE_DATA)
{
dwError = DhcpEnumSubnets(GlobalServerIpAddressUnicodeString,
&m_dhcpResumeHandle,
m_dwPreferredMax,
&pdhcpIpArray,
&dwElementsRead,
&dwElementsTotal);

if (dwElementsRead && dwElementsTotal && pdhcpIpArray)
{
//
// loop through all of the subnets that were returned
//
for (DWORD i = 0; i < pdhcpIpArray->NumElements; i++)
{

//printf("DHCP Subnet number = %d\n", pdhcpIpArray->NumElements);

strcpy (subnet_ip1, DhcpIpAddressToDottedString(pdhcpIpArray->Elements[i]));
subnet_ip = pdhcpIpArray->Elements[i];
//printf("DHCP Subnet IP address = %s\n",
DhcpIpAddressToDottedString(subnet_ip));

nRet = DhcpEnumSubnetClients(GlobalServerIpAddressUnicodeString, subnet_ip,
&handle, 0xFFFFFFFF, &clinfo, &read, &total);
if ( (nRet == ERROR_MORE_DATA ) || (nRet == ERROR_SUCCESS) )
{
for (DWORD j=0; j< clinfo->NumElements; j++)
{
wprintf(L"clients name= %s", clinfo->Clients[j]->ClientName);
printf("\tIP= %s \t Subnet IP address=%s\n",
DhcpIpAddressToDottedString(clinfo->Clients[j]->ClientIpAddress),subnet_ip1)
;

printf("\tExpires = ");

FileTimeToLocalFileTime((FILETIME
*)(&clinfo->Clients[j]->ClientLeaseExpires),
&LocalTime) ;
FileTimeToSystemTime( &LocalTime, &SystemTime );

printf( "%02u/%02u/%02u %02u:%02u:%02u.\n",
SystemTime.wMonth,
SystemTime.wDay,
SystemTime.wYear,
SystemTime.wHour,
SystemTime.wMinute,
SystemTime.wSecond );

}
}
else
{
printf("\nDhcpEnumSubnetClients() error = %d", nRet);
}

} //for

} // if

} ///while
return 0;
}

Thanks and Merry Christmas!

Best regards,
Jeffrey Tan
Microsoft Online Community Support
==================================================
Get notification to my posts through email? Please refer to
http://msdn.microsoft.com/subscriptions/managednewsgroups/default.aspx#notif
ications.

Note: The MSDN Managed Newsgroup support offering is for non-urgent issues
where an initial response from the community or a Microsoft Support
Engineer within 1 business day is acceptable. Please note that each follow
up response may take approximately 2 business days as the support
professional working with you may need further investigation to reach the
most efficient resolution. The offering is not appropriate for situations
that require urgent, real-time or phone-based interactions or complex
project analysis and dump analysis issues. Issues of this nature are best
handled working with a dedicated Microsoft Support Engineer by contacting
Microsoft Customer Support Services (CSS) at
http://msdn.microsoft.com/subscriptions/support/default.aspx.
==================================================
This posting is provided "AS IS" with no warranties, and confers no rights.
Jeffrey Tan[MSFT] - 27 Dec 2007 02:56 GMT
Hi Coconet ,

Have you reviewed my reply to you? Does it make sense to you? If you still
need any help, please feel free to feedback, thanks.

Best regards,
Jeffrey Tan
Microsoft Online Community Support

Rate this thread:







Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.