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

3

我有一个服务需要每五分钟更新注册表(对抗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");

有什么想法吗?

编辑:

感谢回复。我不知道为什么“CurrentUser”逃过了我的注意。感谢指出这一点。

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

编辑:

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

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

5
请参考此页面

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

注册表键HKEY_CURRENT_USER与默认用户相关联,而不是当前用户。要访问另一个用户的配置文件,请模拟该用户,然后访问HKEY_CURRENT_USER。


3

你希望在一个服务中,Currentuser代表什么(谁)?


2

注册表总是很有趣,但这是否意味着您正在编辑“本地系统”用户的用户注册表设置?因此,除非您的实际用户已登录为“本地系统”(我非常怀疑),否则他们将看不到任何内容...

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


2

使用另一个已登录的帐户来运行您的服务。

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


实际上,本地系统/本地服务/网络服务帐户都有它们的HKCU条目。只需检查HK_USERS即可。 - Dmitri Sosnik

2

如果在服务外部它能够正常工作,那么可能是权限问题。当您尝试使用key.SetValue()时,是否出现异常?该服务是否在具有写入注册表权限的帐户下运行?


1
尝试将注册表操作代码放在try-catch块中;服务运行在辅助线程中,会吞噬异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接