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会报告权限错误和成功。您需要等待一段时间,但您应该将您的答案作为答案而不是问题的一部分发布。我正计划发布。这是我第一次看到回答我自己问题的计时器。