这可能与UAC(用户账户控制)有关,它是Windows Vista和Windows 7的额外保护层。
您需要请求对注册表的权限。
编辑:
您现在的代码:
var keys = Registry.LocalMachine.OpenSubKey("SOFTWARE")
.OpenSubKey("Microsoft")
.OpenSubKey("Cryptography", RegistryKeyPermissionCheck.ReadSubTree)
.GetValueNames();
只请求加密子键的权限可能导致问题(至少我曾经遇到过),因此新代码应该是:
var keys = Registry.LocalMachine.OpenSubKey("SOFTWARE", RegistryKeyPermissionCheck.ReadSubTree)
.OpenSubKey("Microsoft", RegistryKeyPermissionCheck.ReadSubTree)
.OpenSubKey("Cryptography", RegistryKeyPermissionCheck.ReadSubTree)
.GetValueNames();
编辑2:
我已经将调试器附加到它上面,针对这段代码:
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();
事实证明,您可以读取该特定值,至少这是我的猜测,因为所有数据都是正确的,直到我打开key3,那里的ValueCount为零,而不是预期的1。
我认为这是一种受保护的特殊值。