Registry.GetValue有什么问题?

Evl*_*tnt 8 .net c# registry

我试图获得一个注册表值:

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中读取值的方法.


Aid*_*api 7

它可能与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.

我认为这是一个受到保护的特殊价值.


Mar*_*wul 6

你说你在64位Windows上:你的应用程序是32位?如果是这样,它可能会受到注册表重定向的影响而正在考虑中HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Cryptography.您可能需要P/Invoke来解决它:http://msdn.microsoft.com/en-us/library/aa384129.aspx.