Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to generate unique serial number of machine in Delphi?

I have question how to generate unique serial number of machine in Delphi? I tried to do this using the ID the motherboard or processor, but unfortunately it's unfortunately supported. Partition serial numbers, etc. fall off, because it is changing after the formatted. I'm looking for something that doesn't change after the formatted. Has anyone any idea?

like image 782
noxwow Avatar asked Jun 05 '10 20:06

noxwow


6 Answers

Inside JCL library, there are several functions very usefull for this topic:

function CPUID: TCpuInfo;
function GetMacAddresses(const Machine: string; const Addresses: TStrings): Integer;
function GetVolumeSerialNumber(const Drive: string): string;
function GetBIOSName: string;
like image 192
TridenT Avatar answered Oct 06 '22 00:10

TridenT


What you're after is actually some sort of "hardware fingerprint", not an "serial number". The problem with this approach is that it's not 100% reliable. Proof: Microsoft didn't manage to find a way to properly limit OEM software to any single computer, you can actually re-install a OEM license on a new computer after a while! Once you agree there can't be a perfect solution you may look at your options and try getting something that's good enough.

For my applications I'm creating a fingerprint based on info returned by GetSystemInfo, GetVolumeInformation and (for the 'C:' partition) and a selection of registry keys from HKLM\HARDWARE (lots of registry keys actually, everything but usb, keyboard and mouse stuff). I'm reading hardware information from the registry because a Windows application can't really access hardware directly (DOS-style approaches can't work), and because I don't have time to figure out ways to determine hardware-related information for many different devices.

My approach has the following disadvantages:

  • Uses the partition serial number, as set up by Format. An format would clearly change the fingerprint.
  • Uses information about the installed drivers. Updating an driver might actually change the fingerprint! Moving a card from one PCI port to an other might change the fingerprint.

None the less, even with all of this changing information taken into account, I get collisions: Something like 1/1000 computers! There are several factors at work here:

  • Big OEM build many computers using the same hardware. They also clone HDD's in order to speed up software installation so different PC's might get the same partition serial number.
  • I'm building a very short hash from all that information, short enough so people can read it to me on the phone without too many mistakes.

This system works for me, but it will not work for you if you expect to re-identify computers once they're reinstalled.

like image 38
Cosmin Prund Avatar answered Oct 06 '22 01:10

Cosmin Prund


You can test GLibWMI that extract information of several components on Windows.
It's free and source included. You can find it on my Web or in Sourceforge.

alt text http://img175.imageshack.us/img175/1250/imagen344.png

Include components for BIOSInfo, DiskInfo, ProcessorInfo,...

With this three components you can obtain information like this:

alt text http://img690.imageshack.us/img690/6006/imagen349.png

You can find the BIN/EXE of GenericDemo (all components) here; You can test all information that you can retrive with this components.

like image 45
Germán Estévez -Neftalí- Avatar answered Oct 05 '22 23:10

Germán Estévez -Neftalí-


I had a similar problem back in the good old DOS days. I found out that the ROM of the installed hardware ie. video card, disk controllers seriel ports etc. was accessible directly, since they are memory-mapped. This means that I was able to create a list of installed hardware, and use it to generate a "serial number", that uniquely identified each computer (until the hardware setup was changed). I'm sure something similar is possible today as well.

Check out http://duartes.org/gustavo/blog/post/motherboard-chipsets-memory-map, if you want to use this approach.

Regards

  • Frank
like image 44
Frank Avatar answered Oct 06 '22 01:10

Frank


Often the MAC address of the (a) network card is used, there are several ways to query the mac address (in Delphi) but the easiest/cleanest way is probably to use the GetAdaptersInfo API.

like image 45
Remko Avatar answered Oct 06 '22 00:10

Remko


Here is a simple solution

  • Generate a GUID
  • Save the Guid value in the registry
  • Use the value of the guid as the serial number

If you a worried about security use a hash over the ( Guid + some secret data)

like image 25
Charles Faiga Avatar answered Oct 06 '22 01:10

Charles Faiga