# Get Windows registry into Mathematica as an association

Windows probably is the only operating system that has a separate database of configuration instructions and paths. The windows registry looks exactly like a giant nested association. Also probably is the fastest and most efficient key-value store there is which is read and written to in real-time. Is there a way to import the Windows registry into a Mathematica association?

The keys of the registry are basic string which Mathematica support and values can be any of the following:

• Binary data
• Unsigned integers
• Multi-string values
• Resource list / Resource descriptor (Plug and play hardware)
• 64 bit-integers

Mathematica has a very powerful query language which can then be used to analyse it.

• What have you tried thus far? Do you have an example of a block of registry entries that someone could use instead of having to find one themselves? – b3m2a1 May 30 at 15:15
• @b3m2a1 Well I tried to use the built in registry editor to export it as a json but there is no such option. – user13892 May 30 at 15:27
• Check ?Developer*Registry*, for example DeveloperEnumerateRegistrySubkeys["HKEY_CLASSES_ROOT"]. – Alexey Popkov May 30 at 15:33
• Also note that there are hidden keys in the Windows registry. You can access them only having appropriate permissions. – Alexey Popkov May 30 at 15:44
• @AlexeyPopkov Thank you it works but is there a way to get the entire hive structure so I can perform queries like keys with values matching a certain criterion. This functionality only accesses the registry one level at a time. – user13892 May 30 at 15:49

I agree that it would be nice if we could import the registry as a nested association. This is really not an answer to that, but I thought it might still be useful to others.

I discovered this post in a search. I was looking for a way to read the value of a registry key from Mathematica. (I needed the path to a data directory of a particular installed software tool.) After a bit of hunting, I came upon the fact that Microsoft .NET includes a class named Registry which provides static methods for manipulating the registry. I found the assembly containing that class on my computer.

The code below uses Mathematica's NET/Link to interface with that class and read the value of a registry key. (I used a common key for this post, so others can run the code.)

Information on NET/Link can be found here.

Information on the Registry class can be found here.

And here is the code: (There are a few continuation \ to remove. )

(* Install NETLink *)

Needs["NETLink"]

InstallNET[];

(* Load the assembly that contains the Registry class *)
(* I found the location by searching for it on my computer *)

asmName =
"C:\\Program \
Files\\dotnet\\shared\\Microsoft.NETCore.App\\2.1.11\\Microsoft.Win32.\
Registry.dll";

(* Since this we will use static methods we will not insantiate a \
Registry object, so we need to load the type explicitly *)

(* we can use NETTypeInfo to see the fields and methods *)
(* I deleted the output before posting because its lengthy *)

NETTypeInfo@registryType

(* output deleted *)

(* one of the functions is GetValue *)
(* here we use it to get the value of a key *)

key = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows \
NT\\CurrentVersion";

valueName = "SystemRoot";

systemRootPath = RegistryGetValue[key, valueName, -1]

(* "C:\\windows" *)