C#Windows服务需要更改注册表

C#Windows服务需要更改注册表,c#,windows-services,registry,C#,Windows Services,Registry,我有一个服务,需要每5分钟更新一次注册表(抵消gpo)。该代码在常规应用程序中运行良好,但当我将其放入windows服务中时,它不会进行更改。我正在使用服务的本地系统帐户,它不会抛出任何异常 以下代码适用于常规控制台应用程序,但不适用于服务: RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", true); if (key != null) {

我有一个服务,需要每5分钟更新一次注册表(抵消gpo)。该代码在常规应用程序中运行良好,但当我将其放入windows服务中时,它不会进行更改。我正在使用服务的本地系统帐户,它不会抛出任何异常

以下代码适用于常规控制台应用程序,但不适用于服务:

RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", true);
        if (key != null)
        {
            key.SetValue("ScreenSaverIsSecure", "0", RegistryValueKind.String);
            key.SetValue("ScreenSaveActive", "0", RegistryValueKind.String);
            key.SetValue("ScreenSaveTimeOut", "0", RegistryValueKind.String);
            key.SetValue("SCRNSAVE.EXE", "", RegistryValueKind.String);
        }


        key = Registry.CurrentUser.OpenSubKey(@"Software\Policies\Microsoft\Windows\Control Panel\Desktop", true);
        if (key != null)
        {
            key.SetValue("ScreenSaverIsSecure", "0", RegistryValueKind.String);
            key.SetValue("ScreenSaveActive", "0", RegistryValueKind.String);
            key.SetValue("ScreenSaveTimeOut", "0", RegistryValueKind.String);
            key.SetValue("SCRNSAVE.EXE", "", RegistryValueKind.String);
        }
        System.Diagnostics.Process.Start(@"c:\windows\System32\RUNDLL32.EXE", "user32.dll, UpdatePerUserSystemParameters");
有什么想法吗

编辑:

谢谢你的回复。我不知道为什么“当前用户”没有引起我的注意。谢谢你指出这一点

我的问题仍然是组策略被推到当前用户身上。现在我正在考虑只创建一个应用程序,在启动时加载并保持活动状态。欢迎提出任何其他建议

编辑:

至于威尔的评论,我在win32 api中找不到UpdatePerUserSystemParameters函数签名。这是否意味着可以在没有参数的情况下调用它

   [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern bool UpdatePerUserSystemParameters();

注册表总是很有趣,但这不意味着您正在编辑“本地系统”用户的用户注册表设置吗?因此,除非您的实际用户以“本地系统”登录(我严重怀疑),否则他们不会看到任何东西


我怀疑您需要编辑计算机范围的设置或活动用户。

尝试将注册表操作代码放入try-catch块;服务在辅助线程中运行,这会导致异常

您希望
Currentuser
在服务中包含什么(谁)?

在另一个实际具有登录名的帐户下运行您的服务


本地系统帐户不是用户,因此没有Registry.CurrentUser密钥(无登录=无当前用户=无当前用户密钥)。

如果它在服务之外工作,可能是权限问题。尝试使用key.SetValue()时是否出现异常?服务是否在对注册表具有写访问权限的帐户下运行?

请参阅:

在LocalSystem帐户上下文中运行的服务继承SCM的安全上下文…这有几个含义:

注册表项HKEY_CURRENT_USER与默认用户关联,而不是与当前用户关联。若要访问其他用户的配置文件,请模拟该用户,然后访问HKEY_CURRENT_USER


事实上,本地系统/本地服务/网络服务帐户获得了他们的HKCU条目。只需检查HKU用户即可。