Having worked at a company that does this kind of hardware fingerprinting, I can tell you that the commercial alternatives are generally pretty solid, but they will all fail in some legitimate cases.
Be aware that some patents in this space are very actively enforced. Some large, successful companies (like Microsoft) who came up with hardware locking algorithms have been successfully sued. If you are very successful in what you do, that may unfortunately happen to you.
If you feel that you need hardware locking, select a company that will make it easy for you to provide customer service to those customers who perform a legitimate upgrade to their system that ends up breaking the fuzzy matching rules. And, be prepared to provide that service quickly and efficiently.
For most use cases, I would warn against hardware locking. It places limitations on your software that will tend to hamper your legitimate customer's legitimate desires to use the software.
Update
Here are a few metrics that can be used in addition to the ones you list. I have not looked into which are particularly easy to get from C#, as most of the code I dealt with at this level was portable C++ with some platform-specific assembly as needed.
- BIOS checksum
- Number and type of of processors (Processor ID is not available for all processors)
- Graphic Card details (often-upgraded part, but provides a little bit of added entropy)
- Number of attached monitors, screen resolution(s), brands (varies often, but again a little added entropy).
- Installed fonts that are unusual and highly differentiating (e.g. ignore ones you get from Office, etc.)
- Mac addess of all installed NICs (e.g. WiFi, wired)
- Serial of all installed HDs
- Enumerate other devices (e.g. DVD, CD, built-in card readers)
Keep in mind that laptops plug into docking stations and may get a number of additional ports, new monitors, etc...