我有一项服务需要每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");
任何想法?
修改
感谢您的回复。我不知道为什么“CurrentUser”无法引起我的注意。谢谢你指出了这一点。
我的问题仍然是群组策略被推送到当前用户。现在我正在考虑创建一个在启动时加载并保持活动状态的应用程序。欢迎任何其他建议。
修改
至于Will的评论,我无法在win32 api中找到 UpdatePerUserSystemParameters 函数签名。这是否意味着可以在没有参数的情况下调用它?
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool UpdatePerUserSystemParameters();
答案 0 :(得分:5)
请参阅this page:
在LocalSystem帐户的上下文中运行的服务会继承SCM的安全上下文...这有几个含义:
注册表项HKEY_CURRENT_USER与默认用户相关联,而不是与当前用户相关联。要访问其他用户的个人资料,请模拟用户,然后访问HKEY_CURRENT_USER。
答案 1 :(得分:3)
您希望Currentuser
在服务中有什么(谁)?
答案 2 :(得分:2)
注册表总是很有趣,但这并不意味着您正在编辑“本地系统”用户的用户注册表设置?因此,除非您的实际用户以“本地系统”登录(我非常怀疑),否则他们不会看到任何内容......
我怀疑您需要编辑机器范围的设置或活动的用户。
答案 3 :(得分:2)
在另一个实际登录的帐户下运行您的服务。
本地系统帐户不是用户,因此没有Registry.CurrentUser密钥(没有登录=没有当前用户=没有当前用户密钥。
答案 4 :(得分:2)
如果它在服务之外工作,则可能是权限问题。当您尝试使用key.SetValue()时是否收到异常?服务是否在对注册表具有写入权限的帐户下运行?
答案 5 :(得分:1)
尝试将注册表操作代码放在try-catch块中;服务在辅助线程中运行,这会占用异常