Exemple #1
0
        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)));
                }
            }
        }
Exemple #2
0
 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;
 }