There is no information on a standard PC, which you can use to uniquely identify it. As you said, your best shot would be to use serial numbers of the components. Because the architecture, Windows driver model .etc. are open, these can be spoofed. You also have to take in to account that your user may replace these components if they fail, which can cause your license validation to fail.
Modern devices like mobile phones has uniquely identifiable information (ex: Android's Device ID) for these kind of purposes.
I suggest your best option would be to identify the user, instead of the machine.. Use a username/password combo which you validate from the server side if it's possible. Otherwise you'll have to take your chances with using a serial number.
You may use a third party solution like an AppStore/Market, which essentially does the validation at server side, every time your application starts. One example was Microsoft Digital Locker introduced with Windows Vista, but it is not available any more.