写入64位注册表的32位Windows服务.(AutoAdminLogon密钥)

Sir*_*ian 6 c# registry

//编辑:哦哇.奇怪的是,我已经在这一天工作了一天,并且意识到我需要这样做:

key = key.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", true);
Run Code Online (Sandbox Code Playgroud)

然后一切正常.我不知道你必须那样做.感谢所有回复的人.我只是乱搞并搜索我的钥匙,发现它被放置在错误的位置.

//原始问题:

我没有看到这方面的工作解决方案,我不确定它是否是一个错误.

我有一个在Windows 7 64位上运行的C#32位Windows服务.我的目标是写入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();
}
Run Code Online (Sandbox Code Playgroud)

不会抛出任何异常或错误.在32位或64位视图中没有任何内容写入注册表.我尝试过使用:

key.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", true);
Run Code Online (Sandbox Code Playgroud)

但它有相同的结果.现在,如果我只是在没有任何视图的情况下编写,那么我的程序会成功写入子项:

SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Winlogon
Run Code Online (Sandbox Code Playgroud)

基本上我想要的只是写入子项:

SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
Run Code Online (Sandbox Code Playgroud)

任何人都知道为什么上面的代码没有写入请求的密钥?(我将指出Windows默认凭据提供程序使用AutoAdminLogon和其他两个密钥,以便在Windows启动时检查这些密钥,如果AutoAdminLogon设置为1,则它会使用给定的用户名和密码自动登录.这样做是为了让计算机通过设置密钥然后重新启动计算机来作为访客登录.

Sir*_*ian 2

奇怪的是,我已经为此工作了一天,然后才意识到我需要这样做:

key = key.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", true);
Run Code Online (Sandbox Code Playgroud)

然后一切都正常了。我不知道你必须这样做。感谢所有回复的人。我只是闲逛并寻找我的钥匙,发现它被放置在错误的位置。