If you base it on serial-numbers, then you're going to piss of both the users and the people who have to provide support. Why? Because every time there's a new harddrive or whatever, the key "appears" invalid. If that is interrupting the user while he needs your app, then pissed it is.
And no, there's no 100% protection either way. Lots of software-based copy-protections can be easily mitigated by installing in a VM with generic hardware. The dongle OTOH is quite hard to circumvent.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]