32位Windows服务写入64位注册表(AutoAdminLogon键)。

6

//编辑: 哇,真奇怪。我已经工作了一天,才意识到我需要这样做:

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

然后一切都正常了。我不知道需要这么做。感谢所有回应我的人。我只是在胡闹,搜索我的密钥时注意到它被放置在错误的位置。
// 原问题:
我没有看到一个可行的解决方案,也不确定这是否是一个错误。
我有一个运行在 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();
}

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

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

但是它的结果相同。如果我没有视图,那么我的程序成功写入了子键:
SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Winlogon

基本上我想要做的是写入子键:
SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

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


尝试使用进程监视器查看是否发生了向注册表写入的低级调用。 - MK.
1
你尝试过使用桌面应用程序吗?在那里调试可能会更容易。 - David Heffernan
1
这可能是一个权限问题吗?如果您的可执行文件中没有元数据表明您理解用户帐户控制(UAC),那么我相信最新版本的 Windows 将报告权限错误和成功。 - Guvante
4
你需要等一段时间,但你应该将你的回答作为回答而不是问题的一部分发布。 - Gabe
计划这么做。这是我第一次看到回答自己问题的计时器。 - Sirisian
请不要在标题前加上 "C#" 等内容,这是标签的作用。 - John Saunders
1个回答

2

很奇怪,我已经在做这个工作一整天了,才意识到我需要做:

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

然后一切都正常了。我不知道必须要这样做。感谢所有回复我的人。我只是在摆弄东西,搜寻我的钥匙时注意到它被放错了位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接