This documentation is archived and is not being maintained.

Registry Class

Provides RegistryKey objects that represent the root keys in the Windows registry, and static methods to access key/value pairs.

Namespace:  Microsoft.Win32
Assembly:  mscorlib (in mscorlib.dll)

public static class Registry

This class provides the set of standard root keys found in the registry on machines running Windows. The registry is a storage facility for information about applications, users, and default system settings. For example, applications can use the registry for storing information that needs to be preserved after the application is closed, and access that same information when the application is reloaded. For instance, you can store color preferences, screen locations, or the size of the window. You can control this data for each user by storing the information in a different location in the registry.

The base, or root RegistryKey instances that are exposed by the Registry class delineate the basic storage mechanism for subkeys and values in the registry. All keys are read-only because the registry depends on their existence. The keys exposed by Registry are:


Stores information about user preferences.


Stores configuration information for the local machine.


Stores information about types (and classes) and their properties.


Stores information about the default user configuration.


Stores performance information for software components.


Stores non-user-specific hardware information.


Stores dynamic data.

Once you have identified the root key under which you want to store/retrieve information from the registry, you can use the RegistryKey class to add or remove subkeys, and manipulate the values for a given key.

Hardware devices can place information in the registry automatically using the Plug and Play interface. Software for installing device drivers can place information in the registry by writing to standard APIs.

Static Methods for Getting and Setting Values

In the .NET Framework version 2.0, the Registry class also contains static GetValue and SetValue methods for setting and retrieving values from registry keys. These methods open and close registry keys each time they are used, so they do not perform as well as analogous methods in the RegistryKey class, when you access a large number of values.

The RegistryKey class also provides methods that allow you to set Windows access control security for registry keys, to test the data type of a value before retrieving it, and to delete keys.

This section contains two code examples. The first example demonstrates root keys, and the second example demonstrates the static GetValue and SetValue methods.

Example 1

The following code example demonstrates how to retrieve the subkeys of the HKEY_USERS key, and print their names to the screen. Use the OpenSubKey method to create an instance of the particular subkey of interest. You can then use other operations in RegistryKey to manipulate that key.

using System;
using Microsoft.Win32;

class Reg {
    public static void Main() {

        // Create a RegistryKey, which will access the HKEY_USERS 
        // key in the registry of this machine.
        RegistryKey rk = Registry.Users;

        // Print out the keys.

    static void PrintKeys(RegistryKey rkey) {

        // Retrieve all the subkeys for the specified key.
        String [] names = rkey.GetSubKeyNames();

        int icount = 0;

        Console.WriteLine("Subkeys of " + rkey.Name);

        // Print the contents of the array to the console. 
        foreach (String s in names) {

            // The following code puts a limit on the number 
            // of keys displayed.  Comment it out to print the 
            // complete list.
            if (icount >= 10)

Example 2

The following code example stores values of several data types in an example key, creating the key as it does so, and then retrieves and displays the values. The example demonstrates storing and retrieving the default (nameless) name/value pair, and the use of defaultValue when a name/value pair does not exist.

using System;
using Microsoft.Win32;

public class Example
    public static void Main()
        // The name of the key must include a valid root. 
        const string userRoot = "HKEY_CURRENT_USER";
        const string subkey = "RegistrySetValueExample";
        const string keyName = userRoot + "\\" + subkey;

        // An int value can be stored without specifying the 
        // registry data type, but long values will be stored 
        // as strings unless you specify the type. Note that 
        // the int is stored in the default name/value 
        // pair.
        Registry.SetValue(keyName, "", 5280);
        Registry.SetValue(keyName, "TestLong", 12345678901234,

        // Strings with expandable environment variables are 
        // stored as ordinary strings unless you specify the 
        // data type.
        Registry.SetValue(keyName, "TestExpand", "My path: %path%");
        Registry.SetValue(keyName, "TestExpand2", "My path: %path%",

        // Arrays of strings are stored automatically as  
        // MultiString. Similarly, arrays of Byte are stored 
        // automatically as Binary.
        string[] strings = {"One", "Two", "Three"};
        Registry.SetValue(keyName, "TestArray", strings);

        // Your default value is returned if the name/value pair 
        // does not exist.
        string noSuch = (string) Registry.GetValue(keyName, 
            "Return this default if NoSuchName does not exist.");
        Console.WriteLine("\r\nNoSuchName: {0}", noSuch);

        // Retrieve the int and long values, specifying  
        // numeric default values in case the name/value pairs 
        // do not exist. The int value is retrieved from the 
        // default (nameless) name/value pair for the key. 
        int tInteger = (int) Registry.GetValue(keyName, "", -1);
        Console.WriteLine("(Default): {0}", tInteger);
        long tLong = (long) Registry.GetValue(keyName, "TestLong",
        Console.WriteLine("TestLong: {0}", tLong);

        // When retrieving a MultiString value, you can specify 
        // an array for the default return value. 
        string[] tArray = (string[]) Registry.GetValue(keyName,
            new string[] {"Default if TestArray does not exist."});
        for(int i=0; i<tArray.Length; i++)
            Console.WriteLine("TestArray({0}): {1}", i, tArray[i]);

        // A string with embedded environment variables is not 
        // expanded if it was stored as an ordinary string.
        string tExpand = (string) Registry.GetValue(keyName,
             "Default if TestExpand does not exist.");
        Console.WriteLine("TestExpand: {0}", tExpand);

        // A string stored as ExpandString is expanded.
        string tExpand2 = (string) Registry.GetValue(keyName,
            "Default if TestExpand2 does not exist.");
        Console.WriteLine("TestExpand2: {0}...",
            tExpand2.Substring(0, 40));

        Console.WriteLine("\r\nUse the registry editor to examine the key.");
        Console.WriteLine("Press the Enter key to delete the key.");
// This code example produces output similar to the following: 
//NoSuchName: Return this default if NoSuchName does not exist. 
//(Default): 5280 
//TestLong: 12345678901234 
//TestArray(0): One 
//TestArray(1): Two 
//TestArray(2): Three 
//TestExpand: My path: %path% 
//TestExpand2: My path: D:\Program Files\Microsoft.NET\... 
//Use the registry editor to examine the key. 
//Press the Enter key to delete the key.


Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC

The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

.NET Framework

Supported in: 3.5, 3.0, 2.0, 1.1, 1.0

.NET Compact Framework

Supported in: 3.5, 2.0