C# 32位Windows服务写入64位注册表。(自动登录密钥)

C# 32位Windows服务写入64位注册表。(自动登录密钥),c#,registry,C#,Registry,//编辑: 哦,哇。奇怪的是,我已经为此工作了一天,刚刚意识到我需要做: key = key.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", true); key = key.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", true); 然后一切顺利。我不知道你必须这么做。感谢所有回应的人。我只是胡闹着找钥匙,发现

//编辑: 哦,哇。奇怪的是,我已经为此工作了一天,刚刚意识到我需要做:

key = key.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", true);
key = key.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", true);
然后一切顺利。我不知道你必须这么做。感谢所有回应的人。我只是胡闹着找钥匙,发现钥匙放错了地方

//原始问题:

我还没有看到一个有效的解决方案,我不确定这是否是一个错误

我有一个C#32位Windows服务,运行在64位Windows 7上。我的目标是写入64位注册表,而不是Wow6432Node子项,因为对于AutoAdminLogon,64位系统似乎不会检查键的32位视图

因此,我的代码如下:

static public void LoginAsGuest(EventLog eventLogger)
{
    RegistrySecurity userSecurity = new RegistrySecurity();
    RegistryAccessRule userRule = new RegistryAccessRule("Everyone", RegistryRights.FullControl, AccessControlType.Allow);
    userSecurity.AddAccessRule(userRule);

    var key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
    key.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", RegistryKeyPermissionCheck.ReadWriteSubTree);

    if (key == null)
    {
        eventLogger.WriteEntry("Error accessing the registry key");
    }
    else
    {
        try
        {
            key.SetValue("AutoAdminLogon", "1", RegistryValueKind.String);
            key.SetValue("DefaultUserName", "guest", RegistryValueKind.String);
            key.SetValue("DefaultPassword", "password", RegistryValueKind.String);
        }
        catch (Exception exception)
        {
            eventLogger.WriteEntry("Problem setting up keys: " + exception);
        }
    }
    key.Close();

    Reboot();
}
不会引发异常或错误。在32位或64位视图中,不会向注册表写入任何内容。我试过使用:

key.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", true);
但结果是一样的。现在,如果我只是在没有任何视图的情况下写入,那么我的程序将成功写入子项:

SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Winlogon
SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
基本上,我只想写入子键:

SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Winlogon
SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

有人知道为什么上面的代码没有写入请求的密钥吗?(我要指出,AutoAdminLogon和其他两个密钥由windows默认凭据提供程序使用,因此,当windows启动时,它会检查这些密钥,如果AutoAdminLogon设置为1,则它会使用给定的用户名和密码自动登录。我这样做是为了通过设置这些密钥来允许计算机以来宾身份登录。)n重新启动计算机。)

奇怪的是,我已经为此工作了一天,刚刚意识到我需要做:

key = key.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", true);
key = key.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", true);

然后一切顺利。我不知道你必须这么做。感谢所有回应的人。我只是在胡闹,搜索我的密钥,发现它被放在了错误的位置。

尝试process monitor,看看是否发生了写入注册表的低级调用。您是否尝试过使用桌面应用程序?在那里调试可能更容易。可能是权限问题吗?如果您的可执行文件中没有元数据表明您了解UAC,那么我相信最新版本的Windows会报告权限错误和成功。您需要等待一段时间,但您应该将您的答案作为答案而不是问题的一部分发布。我正计划发布。这是我第一次看到回答我自己问题的计时器。