In general, a non-administrator user has this access to the registry:
HKEY_CLASSES_ROOT(which is just a link to
It is possible to change some of these permissions on a key-by-key basis, but it’s extremely rare. You should not have to worry about that.
For your purposes, your application should be writing settings and configuration to
HKEY_CURRENT_USER. The canonical place is anywhere within
You could potentially hold settings that are global (for all users) in
HKEY_LOCAL_MACHINE. It is very rare to need to do this, and you should avoid it. The problem is that any user can “read” those, but only an administrator (or by extension, your setup/install program) can “set” them.
Other common source of trouble: your application should not write to anything in the
Program files or the
Windows directories. If you need to write to files, there are several options at hand; describing all of them would be a longer discussion. All of the options end up writing to a subfolder or another under
%USERPROFILE% for the user in question.
Finally, your application should stay out of
HKEY_CURRENT_CONFIG. This hive holds hardware configuration, services configurations and other items that 99.9999% of applications should not need to look at (for example, it holds the current plug-and-play device list). If you need anything from there, most of the information is available through supported APIs elsewhere.