遍历注册表项并读取注册表值
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
是字节数组。当RegistryValueKind
为Binary
时,可能会发生这种情况。
那你有什么建议?下面给出的答案似乎不起作用。
ObjectToByteArray
调用是多余的。由于obj
的类型已经是byte[]
,因此进行强制转换就足够了:byte[] test = (byte[])obj
【参考方案1】:
您得到“System.Byte[]”,因为您获取了 byte[]
的实例并在其上调用 ToString()。这不会将字节数组的内容转换为文本,因为您将使用类似Convert.ToBase64String
或Encoding.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 文件中,在那里可以手动处理它们并重新写入注册表。我希望这涵盖了您的答案。
很抱歉没有立即回复,感谢您在这里与我相处以上是关于遍历注册表项并读取注册表值的主要内容,如果未能解决你的问题,请参考以下文章
powershell PowerShell:使用.NET读取远程注册表值