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