There is no universal hardware ID that works, Intel tried to provide one in their Pentium III's with the Processor Serial Number, but there was a large controversy over it and it was removed from later models and did not exist in later generations.
There are specific hardware id's you can read off but there is no standardized way to do it. See the linked question "What's a good way to uniquely identify a computer?" for some possible choices.
The option I do when I need to do this is use the windows serial number, that should be unique per machine, even for cloned machines (due to it changing during the sysprep
process), unless they are violating Microsoft's licencing too and cloning without syspreping.
This can be retreived via WMI
var s = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_OperatingSystem");
var obj = s.Get().Cast<ManagementObject>().First();
var serial = obj["SerialNumber"].ToString();