RSACryptoServiceProvider.UseMachineKeyStore Property

Definition

Gets or sets a value indicating whether the key should be persisted in the computer's key store instead of the user profile store.

C#
public static bool UseMachineKeyStore { get; set; }

Property Value

true if the key should be persisted in the computer key store; otherwise, false.

Examples

The following code example creates an RSACryptoServiceProvider object and sets the static UseMachineKeyStore property to use the machine key store instead of the user profile key store.

C#
using System;
using System.Security.Cryptography;

public class RSAKeyStoreSample
{
    public static void Main()
    {
        // Set the static UseMachineKeyStore property to use the machine key
        // store instead of the user profile key store. All CSP instances not
        // initialized with CspParameters will use this setting.
        RSACryptoServiceProvider.UseMachineKeyStore = true;
        try
        {
            // This CSP instance will use the Machine Store as set above and is
            // initialized with no parameters.
            using (RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider())
            {
                ShowContainerInfo(RSAalg.CspKeyContainerInfo);
                RSAalg.PersistKeyInCsp = false;
            }

            CspParameters cspParams = new CspParameters();

            cspParams.KeyContainerName = "MyKeyContainer";

            // This CSP instance will use the User Store since cspParams are used.
            using (RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(cspParams))
            {
                ShowContainerInfo(RSAalg.CspKeyContainerInfo);
                RSAalg.PersistKeyInCsp = false;
            }

            cspParams.Flags |= CspProviderFlags.UseMachineKeyStore;

            // This CSP instance will use the Machine Store. Although cspParams are used,
            // the cspParams.Flags is set to CspProviderFlags.UseMachineKeyStore.
            using (RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(cspParams))
            {
                ShowContainerInfo(RSAalg.CspKeyContainerInfo);
                RSAalg.PersistKeyInCsp = false;
            }
        }
        catch (CryptographicException e)
        {
            Console.WriteLine("Exception: {0}", e.GetType().FullName);
            Console.WriteLine(e.Message);
        }
    }

    public static void ShowContainerInfo(CspKeyContainerInfo containerInfo)
    {
        string keyStore;

        Console.WriteLine();
        if (containerInfo.MachineKeyStore)
        {
            keyStore = "Machine Store";
        }
        else
        {
            keyStore = "User Store";
        }
        Console.WriteLine("Key Store:     {0}", keyStore);
        Console.WriteLine("Key Provider:  {0}", containerInfo.ProviderName);
        Console.WriteLine("Key Container: \"{0}\"", containerInfo.KeyContainerName);
        Console.WriteLine("Generated:     {0}", containerInfo.RandomlyGenerated);
        Console.WriteLine("Key Nubmer:    {0}", containerInfo.KeyNumber);
        Console.WriteLine("Removable Key: {0}", containerInfo.Removable);
    }
}

Remarks

Setting this property to true is equivalent to passing the UseMachineKeyStore flag to a CspParameters object. The UseMachineKeyStore property applies to all code in the current application domain, whereas the CspParameters object applies only to classes that explicitly reference it. These settings are useful when impersonating or running under an account whose user profile is not loaded. Setting UseMachineKeyStore affects the key store location only if RSACryptoServiceProvider is initialized with no parameters.

Applies to

Product Versions
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

See also