The Delphi TRegistry function CreateKey fails when the user is not logged
in with administrative rights. The cause of this problem is that by default
Delphi opens the Windows registry with security access of KEY_ALL_ACCESS.
Even the Delphi function OpenKeyReadOnly opens the registry with the security
access value KEY_ALL_ACCESS.
This is a major problem since you should store shared information about
your program in HKEY_LOCAL_MACHINE (HKLM) so all users of the computer have
access to the settings. However, especially on a network users should never
be setup as administrators. To get around this problem when your program
needs to access values in the registry, you can use the standard Windows
API functions RegOpenKeyEx, RegQueryValueEx, and RegCloseKey. The RegOpenKeyEx
allows you to set the security access to a lower level such as KEY_READ.
KEY_READ should be the only access required by standard users.
I use the Delphi TRegistry methods to create registry keys when the program
is first run and then use the Windows API functions when I need to read
registry keys. This system works well for me when I deploy my software on
networks. My software must first be run by a user with administrative rights
so various paths to the network control and data directories can be set.
After the initial run any user of the computer can read the necessary paths.
Below is the unit I use to read registry keys with the software I develop.
You can also click here to download
the unit I use to read the registry information. Feel free to add this
unit to your software. If you have any comments or questions please feel
free to email me.