Is there really any way to uniquely identify any computer at all

Solution 1:

How about adding motherboard serial number as well e.g.:

using System.management;


//Code for retrieving motherboard's serial number
ManagementObjectSearcher MOS = new ManagementObjectSearcher("Select * From Win32_BaseBoard");
foreach (ManagementObject getserial in MOS.Get())
{
textBox1.Text = getserial["SerialNumber"].ToString();
}

//Code for retrieving Processor's Identity
MOS = new ManagementObjectSearcher("Select * From Win32_processor");
foreach (ManagementObject getPID in MOS.Get())
{
textBox2.Text = getPID["ProcessorID"].ToString();
}

//Code for retrieving Network Adapter Configuration
MOS = new ManagementObjectSearcher("Select * From Win32_NetworkAdapterConfiguration");
foreach (ManagementObject mac in MOS.Get())
{
textBox3.Text = mac["MACAddress"].ToString();
}

Solution 2:

The fact in getting a globally unique ID is, only MAC address is the ID that will not change if you set up your system all over. IF you are generating a key for a specific product, the best way to do it is assigning unique IDs for products and combining the product ID with MAC address. Hope it helps.

Solution 3:

I Completely agree with just the above comment.

For Software licensening, you can use:

Computer MAC Address (Take all if multiple NIC Card) + Your software Product Code

Most of the renowned telecom vendor is using this technique.

Solution 4:

However, I was absolutely right about the identical Processor ID issue. All three returned the same Processor ID when we put wmic cpu get ProcessorId command in their command prompts.

Processor ID will be same if all the systems are running as virtual machines on the same hypervisor.

MAC ID seems fine. Only thing is users must be provided the option to reset the application, in case the MAC changes.