2012-03-21 46 views
6

//编辑: 哦哇。奇怪的是,我一直在这一天的工作,只是意识到我需要做的: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用户身份登录计算机)。

+0

尝试进程监视器,看看是否发生低级调用写入注册表正在发生 – 2012-03-21 18:44:30

+1

您是否尝试从桌面应用程序?在那里调试可能更容易。 – 2012-03-21 18:53:26

+1

它可能是一个权限问题?如果您的可执行文件中没有关于您理解UAC的元数据,那么我相信最新版本的Windows报告权限错误和成功。 – Guvante 2012-03-21 18:58:00

回答

2

这是奇怪的是,我一直工作在这一天现在才意识到我需要做的:

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

然后一切正常。我不知道你必须这样做。感谢所有回复的人。我只是乱搞,寻找我的钥匙,并注意到它被放在了错误的地方。

相关问题