//编辑: 哦哇。奇怪的是,我一直在这一天的工作,只是意识到我需要做的:32位Windows服务写入64位注册表。 (AutoAdmin登录密钥)
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
任何人都知道为什么上面的代码ISN”写入所请求的密钥? (我会指出AutoAdminLogon和其他两个密钥由Windows默认凭据提供程序使用,以便在Windows启动时检查这些密钥,并且AutoAdminLogon设置为1,然后使用给定的用户名和密码自动登录。这样做是为了允许通过设置密钥然后重新启动计算机以guest用户身份登录计算机)。
尝试进程监视器,看看是否发生低级调用写入注册表正在发生 – 2012-03-21 18:44:30
您是否尝试从桌面应用程序?在那里调试可能更容易。 – 2012-03-21 18:53:26
它可能是一个权限问题?如果您的可执行文件中没有关于您理解UAC的元数据,那么我相信最新版本的Windows报告权限错误和成功。 – Guvante 2012-03-21 18:58:00