Programmatically determine if an IP address is assigned via DHCP or manually set in Java

Is there a way to find out if the local network interface has an address assigned through DHCP, or is it statically set via Java?

+8
source share
2 answers

So, since you only requested a Win NT solution, here is my code. It lists network interfaces with the current configured values.

Note. EnableDHCP registry key value, I think this is the point.

As I mentioned in the comment on your question, you need at least a simple JNI wrapper.

Hope this helps.

more details here: http://support.microsoft.com/kb/314053

#include <windows.h> #define NETCARD_ROOT L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards" #define TCPIP_ROOT L"SYSTEM\\CurrentControlSet\\services\\Tcpip\\Parameters\\Interfaces" int _tmain(int argc, _TCHAR* argv[]) { //First enumerate all network adapters HKEY hNetCardsKey; LSTATUS lStatus = ERROR_SUCCESS; lStatus = RegOpenKey(HKEY_LOCAL_MACHINE, NETCARD_ROOT, &hNetCardsKey); if(ERROR_SUCCESS == lStatus) { DWORD dwCards = 0L; DWORD dwMaxSubkeyNameLen = 0L; lStatus = RegQueryInfoKey(hNetCardsKey, NULL, NULL, NULL, &dwCards, &dwMaxSubkeyNameLen, NULL, NULL, NULL, NULL, NULL, NULL); if(ERROR_SUCCESS == lStatus && dwCards) { for(DWORD i = 0; i < dwCards; i++) { TCHAR wszCurrentCardIdxName[MAX_PATH]; wszCurrentCardIdxName[0] = '\0'; lStatus = RegEnumKey(hNetCardsKey, i, wszCurrentCardIdxName, MAX_PATH); if(ERROR_SUCCESS == lStatus) { TCHAR wszAdapterKeyName[MAX_PATH]; wszAdapterKeyName[0] = '\0'; wsprintf(wszAdapterKeyName, L"%s\\%s", NETCARD_ROOT, wszCurrentCardIdxName); HKEY hCardNameKey; lStatus = RegOpenKey( HKEY_LOCAL_MACHINE, wszAdapterKeyName, &hCardNameKey); if(ERROR_SUCCESS == lStatus) { TCHAR wszServiceNameGuid[MAX_PATH]; TCHAR wszAdapterName[MAX_PATH]; DWORD dwSize = sizeof(wszServiceNameGuid); wszServiceNameGuid[0] = '\0'; RegQueryValueEx( hCardNameKey, L"ServiceName", NULL, NULL, (LPBYTE)wszServiceNameGuid, &dwSize); dwSize = sizeof(wszAdapterName); RegQueryValueEx( hCardNameKey, L"Description", NULL, NULL, (LPBYTE)wszAdapterName, &dwSize); OutputDebugStringW(wszServiceNameGuid); OutputDebugStringW(L"\n"); RegCloseKey(hCardNameKey); //Get parameters TCHAR wszCardParamKey[MAX_PATH]; wszCardParamKey[0] = '\0'; wsprintf(wszCardParamKey,L"%s\\%s", TCPIP_ROOT, wszServiceNameGuid); HKEY hParamKey = NULL; lStatus = RegOpenKey( HKEY_LOCAL_MACHINE, wszCardParamKey, &hParamKey); if(ERROR_SUCCESS == lStatus) { DWORD dwEnabledDHCP = 0L; DWORD dwDWSize = sizeof(DWORD); TCHAR wszStaticIP[32]; TCHAR wszDHCPIP[32]; DWORD dwIPSize = sizeof(wszDHCPIP); ZeroMemory(wszDHCPIP, dwIPSize); ZeroMemory(wszStaticIP, dwIPSize); lStatus = RegQueryValueEx( hParamKey, L"EnableDHCP", NULL, NULL, (LPBYTE)&dwEnabledDHCP, &dwDWSize); if(SUCCEEDED(lStatus)) { wprintf_s(L"Adapter : %s [%s] \n\tDHCP : %s\n", wszServiceNameGuid, wszAdapterName, dwEnabledDHCP ? L"Yes" : L"No"); } lStatus = RegQueryValueEx( hParamKey, L"IPAddress", NULL, NULL, (LPBYTE)&wszStaticIP, &dwIPSize); if(SUCCEEDED(lStatus)) { wprintf_s(L"\tConfigured IP Address : %s\n", wszStaticIP); } dwIPSize = sizeof(wszDHCPIP); lStatus = RegQueryValueEx( hParamKey, L"DhcpIPAddress", NULL, NULL, (LPBYTE)&wszDHCPIP, &dwIPSize); if(SUCCEEDED(lStatus)) { wprintf_s(L"\tDHCP IP Address : %s\n", wszDHCPIP); } wprintf_s(L"\n"); RegCloseKey(hParamKey); } } } } } RegCloseKey(hNetCardsKey); } return 0; } 

Simple conclusion:

 Adapter : {6EC2554F-3359-43A2-AADB-57F427DC72FC} [Marvell Yukon 88E8072 PCI-E Gigabit Ethernet Controller] DHCP : No Configured IP Address : 192.168.5.10 DHCP IP Address : 192.168.1.102 Adapter : {2A28BDA8-ED1D-4E6E-8990-485EE1836828} [Sony Ericsson Device 0016 USB Ethernet Emulation (NDIS 5)] DHCP : Yes Configured IP Address : DHCP IP Address : 0.0.0.0 Adapter : {491DC095-155F-4572-B975-2E1703C17632} [Microsoft Windows Mobile Remote Adapter] DHCP : Yes Configured IP Address : DHCP IP Address : 169.254.2.2 Adapter : {5F987E64-E804-42DA-9453-8E479B6FC835} [Broadcom 802.11b/g Network adapter] DHCP : Yes Configured IP Address : DHCP IP Address : 192.168.1.14 
+3
source

Sorry, no, I don’t think so. you cannot do this through JAVA, since the java interface with the OS network is just the JVM.
Jni can be summarized to complete the task.

0
source

All Articles