我试图获得一个注册表值:
var value = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography", "MachineGuid", 0);
Run Code Online (Sandbox Code Playgroud)
在Windows XP中一切正常,但在Windows 7中返回0.在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography使用regedit我看到MachineGuid,但如果我运行
var keys = Registry.LocalMachine.OpenSubKey("SOFTWARE").OpenSubKey("Microsoft").OpenSubKey("Cryptography", RegistryKeyPermissionCheck.ReadSubTree).GetValueNames();
Run Code Online (Sandbox Code Playgroud)
keys.Length 是0.
我做错了什么?其他值都可以在OS中完成.
ped*_*usa 23
问题是您可能正在将解决方案编译为x86,如果编译为x64,则可以读取值.
尝试以下代码编译为x86和x64:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("MachineGUID:" + MachineGUID);
Console.ReadKey();
}
public static string MachineGUID
{
get
{
Guid guidMachineGUID;
if (Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Cryptography") != null)
{
if (Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Cryptography").GetValue("MachineGuid") != null)
{
guidMachineGUID = new Guid(Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Cryptography").GetValue("MachineGuid").ToString());
return guidMachineGUID.ToString();
}
}
return null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以阅读有关访问备用注册表视图的更多信息.
你可以在这里找到一种在x86和x64中读取值的方法.
它可能与UAC(用户帐户控制)有关.Windows Vista和Windows 7的额外保护层.
您需要请求注册表的权限.
编辑:你的代码现在:
var keys = Registry.LocalMachine.OpenSubKey("SOFTWARE")
.OpenSubKey("Microsoft")
.OpenSubKey("Cryptography", RegistryKeyPermissionCheck.ReadSubTree)
.GetValueNames();
Run Code Online (Sandbox Code Playgroud)
只请求Cryptography子项上的权限,可能导致问题(至少我有一次),所以新代码将是:
var keys = Registry.LocalMachine.OpenSubKey("SOFTWARE", RegistryKeyPermissionCheck.ReadSubTree)
.OpenSubKey("Microsoft", RegistryKeyPermissionCheck.ReadSubTree)
.OpenSubKey("Cryptography", RegistryKeyPermissionCheck.ReadSubTree)
.GetValueNames();
Run Code Online (Sandbox Code Playgroud)
EDIT2:
我在这段代码上附加了调试器:
var key1 = Registry.LocalMachine.OpenSubKey("SOFTWARE", RegistryKeyPermissionCheck.ReadSubTree);
var key2 = key1.OpenSubKey("Microsoft", RegistryKeyPermissionCheck.ReadSubTree);
var key3 = key2.OpenSubKey("Cryptography", RegistryKeyPermissionCheck.ReadSubTree);
var key4 = key3.GetValueNames();
Run Code Online (Sandbox Code Playgroud)
事实证明,您可以读取该特定值,至少这是我的猜测,因为所有数据都是正确的,直到我打开key3,ValueCount为零,而不是预期的1.
我认为这是一个受到保护的特殊价值.
你说你在64位Windows上:你的应用程序是32位?如果是这样,它可能会受到注册表重定向的影响而正在考虑中HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Cryptography.您可能需要P/Invoke来解决它:http://msdn.microsoft.com/en-us/library/aa384129.aspx.
| 归档时间: |
|
| 查看次数: |
21831 次 |
| 最近记录: |