See the question and my original answer on StackOverflow

Facts you'll have to think about:

  • The machine or workstation notion is not really usable, now with Virtual Machines, Remote Sessions, Hypervisors, etc... the "hardware" does not exists anymore. Everything becomes "virtualware" :-)
  • New Windows versions (aka Vista, 7) security have been considerably strenghened, including the UAC. This is good for users but not that good for developers. It means your users may not be able to read hardware information, or write on the disk outside of their environement (c:\users\john\...)
  • Users simply move from machine to machine (roaming). And this is getting more and more true every day with the generalization of portables, pdas, etc...

It means, you'll have to think about a system more tied to users than to machines.

I would avoid installing drivers, dongles or hardware stuf, or special processes or services with elevated priviledges because this may not support every scenario, from now on.

So you can implement this by giving keys (like Microsoft product keys), tied to users (you can have a database that store user <-> key relations). You could store a key cache "per-user" on every machine where the user logs on, so every time a users logs in, you check if he has a valid key, and if he hasn't you "activate" it and store the key (or a hash preferrably). How you defined keys and how you store them (credit card, usb key, etc...) is up to you.