//编辑: 哇,真奇怪。我已经工作了一天,才意识到我需要这样做:
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身份登录,通过设置键然后重新启动计算机)。