public static void GetDHCPleases(List <string> DHCPServerIPs, IDictionary <string, string> MACIPmapping) { uint parsedMask = 0; //Gets all scopes uint resumeHandle = 0; uint numClientsRead = 0; uint totalClients = 0; IntPtr info_array_ptr = IntPtr.Zero; foreach (string DHCPServer in DHCPServerIPs) { uint response = DhcpEnumSubnetClients(DHCPServer, parsedMask, ref resumeHandle, 65536, out info_array_ptr, ref numClientsRead, ref totalClients); //If no results, next DHCP server if ((int)info_array_ptr == 0) { continue; } //Set up client array casted to a DHCP_CLIENT_INFO_ARRAY using the pointer from the response object above DHCP_CLIENT_INFO_ARRAY rawClients = (DHCP_CLIENT_INFO_ARRAY)Marshal.PtrToStructure(info_array_ptr, typeof(DHCP_CLIENT_INFO_ARRAY)); // Loop through the clients structure inside rawClients adding to the dchpClient collection IntPtr current = rawClients.Clients; for (int i = 0; i < (int)rawClients.NumElements; i++) { string machineIP, machineMAC; //Create machine object using the struct DHCP_CLIENT_INFO rawMachine = (DHCP_CLIENT_INFO)Marshal.PtrToStructure(Marshal.ReadIntPtr(current), typeof(DHCP_CLIENT_INFO)); var a = BitConverter.GetBytes(rawMachine.ip).Reverse().ToArray(); var b = BitConverter.ToUInt32(a, 0); //Transform machine information machineIP = new IPAddress(b).ToString(); machineMAC = string.Format("{0:x2} {1:x2} {2:x2} {3:x2} {4:x2} {5:x2}", Marshal.ReadByte(rawMachine.mac.Data), Marshal.ReadByte(rawMachine.mac.Data, 1), Marshal.ReadByte(rawMachine.mac.Data, 2), Marshal.ReadByte(rawMachine.mac.Data, 3), Marshal.ReadByte(rawMachine.mac.Data, 4), Marshal.ReadByte(rawMachine.mac.Data, 5)).ToUpper(); //Add to mapping object MACIPmapping.Add(machineMAC, machineIP); //Move pointer to next machine current = (IntPtr)((int)current + (int)Marshal.SizeOf(typeof(IntPtr))); } } }
static ArrayList findDhcpClients(string server, string subnet) { // set up container for processed clients ArrayList foundClients = new ArrayList(); // make call to unmanaged code uint parsedMask = StringIPAddressToUInt32(subnet); uint resumeHandle = 0; uint numClientsRead = 0; uint totalClients = 0; IntPtr info_array_ptr; uint response = DhcpEnumSubnetClients( server, parsedMask, ref resumeHandle, 65536, out info_array_ptr, ref numClientsRead, ref totalClients ); // set up client array casted to a DHCP_CLIENT_INFO_ARRAY // using the pointer from the response object above DHCP_CLIENT_INFO_ARRAY rawClients = (DHCP_CLIENT_INFO_ARRAY)Marshal.PtrToStructure(info_array_ptr, typeof(DHCP_CLIENT_INFO_ARRAY)); // loop through the clients structure inside rawClients // adding to the dchpClient collection IntPtr current = rawClients.Clients; for (int i = 0; i < (int)rawClients.NumElements; i++) { // 1. Create machine object using the struct DHCP_CLIENT_INFO rawMachine = (DHCP_CLIENT_INFO)Marshal.PtrToStructure(Marshal.ReadIntPtr(current), typeof(DHCP_CLIENT_INFO)); // 2. create new C# dhcpClient object and add to the // collection (for hassle-free use elsewhere!!) dhcpClient thisClient = new dhcpClient(); thisClient.ip = UInt32IPAddressToString(rawMachine.ip); thisClient.hostname = rawMachine.ClientName; thisClient.mac = String.Format("{0:x2}{1:x2}.{2:x2}{3:x2}.{4:x2}{5:x2}", Marshal.ReadByte(rawMachine.mac.Data), Marshal.ReadByte(rawMachine.mac.Data, 1), Marshal.ReadByte(rawMachine.mac.Data, 2), Marshal.ReadByte(rawMachine.mac.Data, 3), Marshal.ReadByte(rawMachine.mac.Data, 4), Marshal.ReadByte(rawMachine.mac.Data, 5)); foundClients.Add(thisClient); // 3. move pointer to next machine current = (IntPtr)((int)current + (int)Marshal.SizeOf(typeof(IntPtr))); } return foundClients; }