Вообще говоря, вам нужно определить комбинацию компонентов и понять, что компоненты могут и будут меняться со временем. Вам нужны алгоритмы толерантности, чтобы сделать обоснованное предположение о том, когда изменение представляет собой обновление машины, которую вы определили ранее, или новую машину, которую вы не видели раньше.
Простым подходом будет перечисление всех перечисленных компонентов, когда вам необходимо определить, с какой машиной вы работаете, и сравнить с предыдущими снимками машин, которые вы видели ранее. Если что-либо с серийным номером совпадает, вы можете с уверенностью предположить, что имеете дело с той же машиной (хотя, конечно, возможно, что кто-то перенес жесткий диск на новую машину ... но тогда это просто ) подход. Эвристика коммерческого уровня намного сложнее.).
Использование этого подхода специально для активации программного обеспечения защищено патентом, который активно применяется, поэтому будьте осторожны с тем, что вы делаете. Если вы хотите сделать это для защиты своего программного обеспечения, может быть лучше использовать коммерческое решение. Некоторые из них вполне доступны. Google "активация программного обеспечения" для вариантов.
Вот некоторые ссылки для получения конкретной системной информации (не все являются конкретными поваренными книгами C, но C может использоваться в каждом случае).
Жесткий диск Windows
http://www.codeproject.com/KB/cs/hard_disk_serialno.aspx
HDD Linux
http://www.webmasterworld.com/forum40/957.htm
BIOS Windows
http://msdn.microsoft.com/en-us/library/aa394077(v=vs.85).aspx
BIOS Linux
http://www.dufault.info/blog/a-better-way-to-find-your-bios-version-in-linux/
MAC-адрес Windows
C ++: получить MAC-адрес сетевых адаптеров в Vista?
MAC-адрес Linux
http://www.linuxquestions.org/questions/programming-9/linux-determining-mac-address-from-c-38217/