无法在HKEY_LOCAL_MACHINE \ Software下写入注册表

时间:2011-02-09 20:58:43

标签: c# winapi registry uac

我正在编写一个需要创建一个隐藏在登录屏幕和控制面板用户小程序中的特殊用户帐户的应用程序。通过使用用户名将DWORD值0写入下面的注册表项,我可以实现此目标:

  

HKEY_LOCAL_MACHINE \ SOFTWARE \微软\窗户   NT \ CURRENTVERSION \ Winlogon中\在SpecialAccounts \的UserList

问题是在启用了UAC的Windows 7下,无论我尝试什么,我都无法以编程方式将值写入上面的键。

我的理解是,在启用UAC的Windows 7上不允许写入某些键,除非您使用管理权限运行。我添加了一个应用程序清单requestedExecutionLevel level="requireAdministrator" uiAccess="false",我在程序运行时接受UAC提示,我的帐户是管理员的成员,但我仍然无法写入上述注册表项。

我还需要做什么?在任何应用程序配置中,如何在HKEY_LOCAL_MACHINE\SOFTWARE下编写密钥和值?

更多信息......当我的程序运行时,不会抛出任何错误,它似乎写入值。我的猜测是Windows正在虚拟化我正在编写的位置。如果我要隐藏这个特殊用户帐户,我需要写入实际位置而不是虚拟位置。

4 个答案:

答案 0 :(得分:12)

该程序可能在64位操作系统上以32位程序运行?在这种情况下,我建议您搜索在Wow6432Node的{​​{1}}子项下创建的值。

您可以详细了解此类虚拟化here。您可以在某些API中使用KEY_WOW64_32KEY flag,以便能够在没有虚拟化的情况下使用完整的注册表。

答案 1 :(得分:1)

将值写入注册表

string user = Environment.UserDomainName + "\\" + Environment.UserName;

RegistrySecurity rs = new RegistrySecurity();

rs.AddAccessRule(new RegistryAccessRule(user,
    RegistryRights.WriteKey | RegistryRights.ChangePermissions,
    InheritanceFlags.None, PropagationFlags.None, AccessControlType.Deny));

RegistryKey rk = null;
try
{
  rk = Registry.CurrentUser.CreateSubKey("SOFTWARE\\TEST", 
                                   RegistryKeyPermissionCheck.Default, rs);
  rk.SetValue("NAME", "IROSH);
  rk.SetValue("FROM", "SRI LANKA");
}

答案 2 :(得分:0)

这可能与他们在Vista中添加的重定向有关。如果您试图从代码中读取该注册表值,我会很好奇,如果您能够获得您期望的值。您可能还想启动RegMon,看看您是否可以看到重定向可能会迫使您。

答案 3 :(得分:0)

RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",true);
rk.SetValue("Name", "Value");