如何使用 C# 检查注册表值是不是存在?
Posted
技术标签:
【中文标题】如何使用 C# 检查注册表值是不是存在?【英文标题】:How to check if a registry value exists using C#?如何使用 C# 检查注册表值是否存在? 【发布时间】:2011-05-15 15:18:32 【问题描述】:如何通过 C# 代码检查注册表值是否存在? 这是我的代码,我想检查'Start'是否存在。
public static bool checkMachineType()
RegistryKey winLogonKey = Registry.LocalMachine.OpenSubKey(@"System\CurrentControlSet\services\pcmcia", true);
string currentKey= winLogonKey.GetValue("Start").ToString();
if (currentKey == "0")
return (false);
return (true);
【问题讨论】:
【参考方案1】:当然,“Fagner Antunes Dornelles”的答案是正确的。但在我看来,另外检查注册表分支本身是值得的,或者确定确切存在的部分。
例如(“dirty hack”),我需要建立对 RMS 基础结构的信任,否则当我打开 Word 或 Excel 文档时,将提示我输入“Active Directory Rights Management Services”。以下是我如何在企业基础架构中为我的服务器添加远程信任。
foreach (var strServer in listServer)
try
RegistryKey regCurrentUser = Registry.CurrentUser.OpenSubKey($"Software\\Classes\\Local Settings\\Software\\Microsoft\\MSIPC\\strServer", false);
if (regCurrentUser == null)
throw new ApplicationException("Not found registry SubKey ...");
if (regCurrentUser.GetValueNames().Contains("UserConsent") == false)
throw new ApplicationException("Not found value in SubKey ...");
catch (ApplicationException appEx)
Console.WriteLine(appEx);
try
RegistryKey regCurrentUser = Registry.CurrentUser.OpenSubKey($"Software\\Classes\\Local Settings\\Software\\Microsoft\\MSIPC", true);
RegistryKey newKey = regCurrentUser.CreateSubKey(strServer, true);
newKey.SetValue("UserConsent", 1, RegistryValueKind.DWord);
catch(Exception ex)
Console.WriteLine($"ex Pipec kakoito ...");
【讨论】:
【参考方案2】:public bool ValueExists(RegistryKey Key, string Value)
try
return Key.GetValue(Value) != null;
catch
return false;
这个简单的函数只有在找到一个值但它不为空时才返回真,否则如果值存在但它为空或键中不存在该值,则返回假。
你的问题的用法:
if (ValueExists(winLogonKey, "Start")
// The values exists
else
// The values does not exists
【讨论】:
【参考方案3】:对于Registry Key,获取后可以检查是否为null。如果它不存在,它将是。
对于注册表值,您可以获得当前键的值名称,并检查此数组是否包含所需的值名称。
例子:
public static bool checkMachineType()
RegistryKey winLogonKey = Registry.LocalMachine.OpenSubKey(@"System\CurrentControlSet\services\pcmcia", true);
return (winLogonKey.GetValueNames().Contains("Start"));
【讨论】:
后者的示例,因为这就是问题所在? 我不敢相信这是公认的答案o.O【参考方案4】:public static bool RegistryValueExists(string hive_HKLM_or_HKCU, string registryRoot, string valueName)
RegistryKey root;
switch (hive_HKLM_or_HKCU.ToUpper())
case "HKLM":
root = Registry.LocalMachine.OpenSubKey(registryRoot, false);
break;
case "HKCU":
root = Registry.CurrentUser.OpenSubKey(registryRoot, false);
break;
default:
throw new System.InvalidOperationException("parameter registryRoot must be either \"HKLM\" or \"HKCU\"");
return root.GetValue(valueName) != null;
【讨论】:
@hsanders 即使问题已经得到解答,也欢迎添加有用的信息。堆栈溢出从 Google 获得大量流量;) root.GetValue(valueName) != null 如果 valueName 不存在则抛出异常。 应该改成return root?.GetValue(valueName) != null; 如果 valueName 不存在,GetValue 会抛出哪个异常?【参考方案5】: internal static Func<string, string, bool> regKey = delegate (string KeyLocation, string Value)
// get registry key with Microsoft.Win32.Registrys
RegistryKey rk = (RegistryKey)Registry.GetValue(KeyLocation, Value, null); // KeyLocation and Value variables from method, null object because no default value is present. Must be casted to RegistryKey because method returns object.
if ((rk) == null) // if the RegistryKey is null which means it does not exist
// the key does not exist
return false; // return false because it does not exist
// the registry key does exist
return true; // return true because it does exist
;
用法:
// usage:
/* Create Key - while (loading)
RegistryKey k;
k = Registry.CurrentUser.CreateSubKey("stuff");
k.SetValue("value", "value");
Thread.Sleep(int.MaxValue);
; // no need to k.close because exiting control */
if (regKey(@"HKEY_CURRENT_USER\stuff ... ", "value"))
// key exists
return;
// key does not exist
【讨论】:
GetValue
的返回类型永远不会是 RegistryKey
类型,所以你为什么要转换它?【参考方案6】:
string keyName=@"HKEY_LOCAL_MACHINE\System\CurrentControlSet\services\pcmcia";
string valueName="Start";
if (Registry.GetValue(keyName, valueName, null) == null)
//code if key Not Exist
else
//code if key Exist
【讨论】:
【参考方案7】: RegistryKey rkSubKey = Registry.CurrentUser.OpenSubKey(" Your Registry Key Location", false);
if (rkSubKey == null)
// It doesn't exist
else
// It exists and do something if you want to
【讨论】:
这个解决方案是检查key是否存在。对于值,我们必须检查该键中的值列表以上是关于如何使用 C# 检查注册表值是不是存在?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 C# 或 Javascript 检查文件是不是存在?
C# - 如何检查用户的输入是不是存在于组合框中(使用的数据绑定项)