//编辑: 哦哇奇怪的是,我现在已经在这方面工作了一天,并且意识到我需要这样做:
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
任何人都知道为什么上面的代码没有写入请求的密钥? (我将指出Windows默认凭据提供程序使用AutoAdminLogon和其他两个密钥,以便在Windows启动时检查这些密钥,如果AutoAdminLogon设置为1,则它会使用给定的用户名和密码自动登录。我这样做是为了让计算机通过设置密钥然后重新启动计算机作为访客登录。
答案 0 :(得分:2)
奇怪的是,我现在已经为此工作了一天,并且意识到我需要这样做:
key = key.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", true);
然后一切正常。我不知道你必须那样做。感谢所有回复的人。我只是乱搞并搜索我的钥匙,发现它被放置在错误的位置。