遍历注册表项并读取注册表值

Posted

技术标签:

【中文标题】遍历注册表项并读取注册表值【英文标题】:Iterate through registry keys and read registry values 【发布时间】:2015-01-08 21:27:37 【问题描述】:

我想遍历特定路径的值并读取它们。 我试过这个

代码更新

RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Internet Explorer\IntelliForms\Storage2", true);
        var names = key.GetValueNames();
        for (int i = 0; i < names.Length; i++)
            
                Console.WriteLine(names[i]);
                byte[] test = ObjectToByteArray(key.GetValue(names[i]));
                var value = Convert.ToBase64String(test);
                Console.WriteLine(value);
            ;

通常字符串value 应该是一个加密的二进制文件。

更新: 正如@Peter Lillevold 建议的那样,我必须将字节数组转换为字符串。 为此,我创建了这个小函数来将对象key.GetValue 转换为字节数组

public static byte[] ObjectToByteArray(Object obj)
        
            if (obj == null)
                return null;
            BinaryFormatter Binaryform = new BinaryFormatter();
            MemoryStream MemStream = new MemoryStream();
            Binaryform.Serialize(MemStream, obj);
            return MemStream.ToArray();
        

然后按照@Peter 的建议转换为字符串。

因此,在转换字节数组之后,它应该返回一个二进制字符串。 我得到的是一些奇怪的字母和数字组合,但它不是二进制的。

有什么帮助吗?

【问题讨论】:

因为Value 是字节数组。当RegistryValueKindBinary 时,可能会发生这种情况。 那你有什么建议?下面给出的答案似乎不起作用。 ObjectToByteArray 调用是多余的。由于obj 的类型已经是byte[],因此进行强制转换就足够了:byte[] test = (byte[])obj 【参考方案1】:

您得到“System.Byte[]”,因为您获取了 byte[] 的实例并在其上调用 ToString()。这不会将字节数组的内容转换为文本,因为您将使用类似Convert.ToBase64StringEncoding.UTF8.GetString 的内容。更多关于该主题的讨论在this SO question。

【讨论】:

其实string value = key.GetValue(names[i]);被视为一个对象。然而,它的控制台写入写入 System.Bytes[] ,这意味着一个字节数组。您建议的转换似乎不起作用,或者我做错了什么 是的,正如我所说,key.GetValue 的结果会产生一个字节数组类型的对象。 Console.Write 和你做的一样,在字节数组上调用 ToString,这反过来只会产生文本“System.Byte[]”。那么......你是什么意思“似乎不起作用”?显示一些您尝试过的代码。此外,给定注册表中的二进制值,显示您最终需要的文本。 嗯,不完全是。你应该能够做到byte[] test = (byte[])key.GetValue(names[i]); 接下来,我希望你展示一个你期望输出的例子。我使用ToBase64String 的示例将为您提供(惊喜!)字节数组的base64 表示。如果这不是你想要的,你必须告诉我们你所说的“二进制字符串”是什么意思。 我做不到这就是我创建那个小函数的原因。我现在能够做到,我一定是一开始就错过了什么。如果我在这里正确理解了您的问题,那么在该路径中存储了我们选择存储的 IE 凭据(并且显然是自动填充的)。我有重要的凭据,如果我丢失了,需要时间才能重新找回它们(电子邮件凭据、个人卡凭据)。所以我的计划是:第一个备份它们,第二个将它们保存在一个 .txt 文件中,在那里可以手动处理它们并重新写入注册表。我希望这涵盖了您的答案。 很抱歉没有立即回复,感谢您在这里与我相处

以上是关于遍历注册表项并读取注册表值的主要内容,如果未能解决你的问题,请参考以下文章

如何从注册表中读取 REG_BINARY 值关联值?

从注册表读取字符串值,但结果包含一些奇怪的字符

从注册表中读取值

powershell PowerShell:使用.NET读取远程注册表值

为啥我不能在 64 位机器上正确读取 HKCU 中的 32 位注册表值?

VB6读取注册表项下的所有值