Description
In this article, I am going write C# code to Read and Write Registry Key and Registry Value, C# code to Read Registry Key from Remote machine or Remote computer and Read Registry Value using WMI in Local and Remote machine.
Summary
- Read Registry Key and Value
- Write Registry Key and Value
- Read Remote Machine Registry Value
- Read Registry Value through WMI in C#
- Read Remote Machine Registry Value through WMI in C#
Read Registry Value and Registry Key in C#
You can Read Registry Value in C# by using built-in C# function RegistryKey. Here, I have written simple function to list installed software programs in local machine by reading Control Panel Registry entries
private static List<string> GetInstalledSoftwares()
{
List<string> programs = new List<string>();
string softwareRegLoc = @"SoftwareMicrosoftWindowsCurrentVersionUninstall";
// Open Registry Key in RegistryHive.LocalMachine
RegistryKey regKey = Registry.LocalMachine.OpenSubKey(softwareRegLoc, false);
foreach (string subKeyName in regKey.GetSubKeyNames())
{
// Open Registry Sub Key
RegistryKey subKey = regKey.OpenSubKey(subKeyName);
// Read Value from Registry Sub Key
string softwareName = (string)subKey.GetValue("DisplayName");
if (!string.IsNullOrEmpty(softwareName))
{
programs.Add(softwareName);
}
}
return programs;
}
Write Registry Value and Registry Key using C#
You can create Registry Key and write Registry Value in C# by using built-in C# function RegistryKey. Here, I have written simple function to create registry sub key ‘MorganApps‘ and write registry values in this sub key.
private static void WriteRegistry()
{
string softwareRegKey = @"Software";
// Set second argument as 'True' to give write access in this key
RegistryKey regKey = Registry.LocalMachine.OpenSubKey(softwareRegKey, true);
RegistryKey appKey = regKey.CreateSubKey("MorganApps");
appKey.SetValue("DisplayName", (object)"WriteRegApp", RegistryValueKind.String);
appKey.SetValue("Publisher", (object)"Morgan Tech Space", RegistryValueKind.String);
appKey.SetValue("Version", (object)"v1.0", RegistryValueKind.String);
}
After executing this C# code, you can see the Registry Key ‘MorganApps’ like shown in below image
Read Registry Value from Remote Machine in C#
You can read Registry Value and Key from Remote Machine in C# by using following function.
private static List<string> ReadRegistryFromRemoteMachine(string machineName)
{
List<string> programs = new List<string>();
string softwareRegLoc = @"SoftwareMicrosoftWindowsCurrentVersionUninstall";
// Open Remote Machine Registry Key
RegistryKey remoteKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, machineName);
RegistryKey regKey = remoteKey.OpenSubKey(softwareRegLoc);
foreach (string subKeyName in regKey.GetSubKeyNames())
{
// Open Registry Sub Key
RegistryKey subKey = regKey.OpenSubKey(subKeyName);
// Read Value from Registry Sub Key
string softwareName = (string)subKey.GetValue("DisplayName");
if (!string.IsNullOrEmpty(softwareName))
{
programs.Add(softwareName);
}
}
return programs;
}
Read Registry Value via WMI using C#
You can read Registry Value and Key in C# by using WMI class StdRegProv instead of using .NET class RegistryKey.
private static List<string> ReadRegistryusingWMI()
{
List<string> programs = new List<string>();
ManagementScope scope = new ManagementScope("\.rootCIMV2");
scope.Connect();
string softwareRegLoc = @"SoftwareMicrosoftWindowsCurrentVersionUninstall";
ManagementClass registry = new ManagementClass(scope, new ManagementPath("StdRegProv"), null);
ManagementBaseObject inParams = registry.GetMethodParameters("EnumKey");
inParams["hDefKey"] = 0x80000002;//HKEY_LOCAL_MACHINE
inParams["sSubKeyName"] = softwareRegLoc;
// Read Registry Key Names
ManagementBaseObject outParams = registry.InvokeMethod("EnumKey", inParams, null);
string[] programGuids = outParams["sNames"] as string[];
foreach (string subKeyName in programGuids)
{
inParams = registry.GetMethodParameters("GetStringValue");
inParams["sSubKeyName"] = softwareRegLoc + @"" + subKeyName;
inParams["sValueName"] = "DisplayName";
// Read Registry Value
outParams = registry.InvokeMethod("GetStringValue", inParams, null);
if (outParams.Properties["sValue"].Value != null)
{
string softwareName = outParams.Properties["sValue"].Value.ToString();
programs.Add(softwareName);
}
}
return programs;
}
//HKEY_CLASSES_ROOT (2147483648 (0x80000000))
//HKEY_CURRENT_USER (2147483649 (0x80000001))
//HKEY_LOCAL_MACHINE (2147483650 (0x80000002))
//HKEY_USERS (2147483651 (0x80000003))
//HKEY_CURRENT_CONFIG (2147483653 (0x80000005))
Read Registry Value from Remote Machine via WMI using C#
You can use below C# function to get list of installed programs in Remote Machine by reading Registry Value via WMI in C#.
private static List<string> ReadRemoteRegistryusingWMI(string machineName)
{
List<string> programs = new List<string>();
ConnectionOptions connectionOptions = new ConnectionOptions();
//connectionOptions.Username = @"DomainAdministrator";
//connectionOptions.Password = "password";
//connectionOptions.Impersonation = ImpersonationLevel.Impersonate;
ManagementScope scope = new ManagementScope("\" + machineName + "rootCIMV2", connectionOptions);
scope.Connect();
string softwareRegLoc = @"SoftwareMicrosoftWindowsCurrentVersionUninstall";
ManagementClass registry = new ManagementClass(scope, new ManagementPath("StdRegProv"), null);
ManagementBaseObject inParams = registry.GetMethodParameters("EnumKey");
inParams["hDefKey"] = 0x80000002;//HKEY_LOCAL_MACHINE
inParams["sSubKeyName"] = softwareRegLoc;
// Read Registry Key Names
ManagementBaseObject outParams = registry.InvokeMethod("EnumKey", inParams, null);
string[] programGuids = outParams["sNames"] as string[];
foreach (string subKeyName in programGuids)
{
inParams = registry.GetMethodParameters("GetStringValue");
inParams["hDefKey"] = 0x80000002;//HKEY_LOCAL_MACHINE
inParams["sSubKeyName"] = softwareRegLoc + @"" + subKeyName;
inParams["sValueName"] = "DisplayName";
// Read Registry Value
outParams = registry.InvokeMethod("GetStringValue", inParams, null);
if (outParams.Properties["sValue"].Value != null)
{
string softwareName = outParams.Properties["sValue"].Value.ToString();
programs.Add(softwareName);
}
}
return programs;
}
Thanks,
Morgan
Software Developer

This article is helpful